1. 程式人生 > >python api介面測試---講解

python api介面測試---講解

在這裡插入圖片描述

講解+體會

一般攜帶引數的地方就在,url,訊息頭,訊息體裡面。 訊息頭裡面,沒說就是沒有引數。訊息頭的格式是不用我們關心的,就是www-from-urlencode(鍵值對) 訊息體的格式,看訊息頭裡面的Content-Type

import requests

#訊息體的格式是www-from-urlencode,構建字典傳參
payload = {
    "action" : "add_course",
    "data":"""{
        "name":"初中化學",
        "desc":"初中化學課程",
        "display_idx":"4"
    }
    """
}    #data引數是json格式的字串,在python裡面表示換行的字串,用3個引號。當然不換行也可以,那就不需要3引號了。json裡面的都是雙引號

#傳送post請求 data接收的是字典型別的,會自動轉化成urlencode格式 res = requests.post(“http://localhost/api/mgr/sq_mgr/”,data=payload) #返回的是request庫裡面的response物件

#如果要獲取響應的訊息體的內容的字串格式就呼叫res.text,返回的是字串型別的物件。只不過字串的內容符合json格式的。如果要檢查裡面的內容,可以用切片,和字串split的方法等。如果訊息體是json格式,就可以呼叫json方法。基本都可以呼叫json方法…json()方法返回的是:把json格式的字串轉化成對應的python裡面的物件。不一定是字典。要看json裡面原來是什麼。可能是列表,字典,正數2也行。

retObj = res.json()
print(retObj)    #python物件,可以打印出來看看

#有一個很實際的問題,如何寫一個用例確保,每次新增的課程名不存在:可以用隨機數(在很大範圍裡面),可以加時間戳。如果一串程式碼要頻繁的重寫,要做成函式,方便呼叫。可以單獨做一個庫檔案。

程式碼: (lib檔案裡面,封裝的程式碼)

import requests
import pprint    #pprint打印出來比較好看




#新增課程的函式

#課程名由呼叫者決定,做好做成引數
def api_add_course(name,desc,idx):

    #訊息體的格式是www-from-urlencode,構建字典傳參
    payload = {
        "action" : "add_course",
        "data":"""{     
            "name":"%s",
            "desc":"%s",
            "display_idx":"%s"
        }
        """%(name,desc,idx)
    }    #data引數是json格式的字串,在python裡面表示換行的字串,用3個引號。當然不換行也可以,那就不需要3引號了。json裡面的都是雙引號

    #傳送post請求 data接收的是字典型別的,會自動轉化成urlencode格式
    res = requests.post("http://localhost/api/mgr/sq_mgr/",data=payload)    #返回的是request庫裡面的response物件

    #如果要獲取響應的訊息體的內容的字串格式就呼叫res.text,返回的是字串型別的物件。只不過字串的內容符合json格式的。如果要檢查裡面的內容,可以用切片,和字串split的方法等。如果訊息體是json格式,就可以呼叫json方法。基本都可以呼叫json方法..json()方法返回的是:把json格式的字串轉化成對應的python裡面的物件。不一定是字典。要看json裡面原來是什麼。可能是列表,字典,正數2也行。
    retObj = res.json()
    pprint.pprint(retObj)    #python物件,可以打印出來看看
    #返回的是響應中訊息體對應的物件
    return retObj



#列出課程的api

def api_list_course():
    #傳送post請求 data接收的是字典型別的,會自動轉化成urlencode格式
    res = requests.get("http://localhost/api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20")    #返回的是request庫裡面的response物件

    #如果要獲取響應的訊息體的內容的字串格式就呼叫res.text,返回的是字串型別的物件。只不過字串的內容符合json格式的。如果要檢查裡面的內容,可以用切片,和字串split的方法等。如果訊息體是json格式,就可以呼叫json方法。基本都可以呼叫json方法..json()方法返回的是:把json格式的字串轉化成對應的python裡面的物件。不一定是字典。要看json裡面原來是什麼。可能是列表,字典,正數2也行。
    retObj = res.json()
    pprint.pprint(retObj)  #python物件,可以打印出來看看,不能改diamante去檢查,用return返回的話,可以讓程式碼檢查
    #返回的是響應中訊息體對應的物件
    return retObj

呼叫者裡面的程式碼:

from lib import *     #也可以import  呼叫函式的時候,前面加上lib.函式名》》》lib.api_add_course()
from datetime import datetime     #匯入這個,在這題裡,主要是讓每次新增的課程不一樣

curTime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

coureListBefore = api_list_course()["retlist"]    #字典的取值。沒加課程之前,先列出下課程,方便新增課程之後的比較

name = "python"+curTime   #方便後面驗證課程名
ret = api_add_course(name,"python課程",2)     #新增課程名 他的返回值是響應的訊息體所對應的物件

#檢查retcode是否為0
if ret["retcode"] ==0:
    print("新增課程的返回碼為0")
else:
    print(f'新增課程的返回碼為{ret["retcode"]}!!!')   #格式化輸出

#呼叫課程介面,看新加的課程是不是在裡面

coureListafter = api_list_course()["retlist"]    #就是在這樣的python物件中找資料,是python基礎的問題,類似如下的資料結構
        # {'retcode': 0,
        # 'retlist': [{'desc': 'java課程', 'display_idx': 1, 'id': 995, 'name': 'java'},
        #             {'desc': '初中化學課程', 'display_idx': 4, 'id': 1018, 'name': '初中化學'}],
        # 'total': 2}

#思路1,咋子新增課程之前,可以先呼叫列成課程的介面,新增完在呼叫一下,兩者比一下,是不是就多出一個
#有這樣的語法:main_list = list(set(list_2)-set(list_1))    set是不允許出現重複的,類似於集合一樣的東西
#思路2,自己寫程式碼,用for迴圈
added = []     #就是新新增的課程
for one in coureListafter:      #在新增後的課程列表裡找
    if one not in coureListBefore:      #如果不在之前的列表中,就是新加的
        added.append(one)

#首先判斷先增加的只有一門課程
#assert 是斷言的關鍵字,第一個引數如果是True,他就認為檢查點通過,否則就認為檢查點失敗
try:
    assert len(added) ==1   #如果不等於1,檢查點就失敗,丟擲異常

    newcourse = added[0]    #取出第一個元素,然後檢查每一個資訊是否是之前新加的課程資訊
    assert newcourse["name"] == name
    assert newcourse["desc"] == "python課程"
    assert newcourse["display_idx"] == 2

    # print(newcourse)   可以打印出來看看

    print("\n=============== test case pass ===============")
except:
    print("\n=============== test case faild ===============")

控制的輸出:

“”"

{'retcode': 0,
 'retlist': [{'desc': 'python課程',
              'display_idx': 2,
              'id': 1024,
              'name': 'python2018-11-03 15:39:08'}],
 'total': 1}
{'id': 1029, 'retcode': 0}
新增課程的返回碼為0
{'retcode': 0,
 'retlist': [{'desc': 'python課程',
              'display_idx': 2,
              'id': 1024,
              'name': 'python2018-11-03 15:39:08'},
             {'desc': 'python課程',
              'display_idx': 2,
              'id': 1029,
              'name': 'python2018-11-03 15:49:26'}],
 'total': 2}

=============== test case pass ===============