一、logging在接口自動化里的應用
1、設置日志的配置,并收集日志文件
日志的設置需要在pytest.ini文件里設置。這個里面盡量不要有中文
2、debug日志的打印
pytest.ini文件的開關一定得是true才能在控制臺打印日志
import allure
import pytest
from P06_PytestFrame.api_keyword.api_key import ApiKey
import logging@allure.title("DS01-通過用戶名可以正確登錄")
def test_login():# 1. 最重要的日志打印logging.basicConfig(level=logging.DEBUG)logging.error("執行用例:DS01-通過用戶名可以正確登錄")url = "http://shop-xo.hctestedu.com/index.php?s=/api/user/login"params = {"application": "app", "application_client_type": "weixin"}data = {"accounts": "hami", "pwd": "123456", "type": "username"}ak = ApiKey()# 2. 發送請求res = ak.post(url=url, params=params, data=data)print(f"響應結果是:{res.json()}")# 3.斷言sj_res = ak.get_text(res.json(), "$.msg")qw_res = "登錄成功1"assert sj_res == qw_res, "結果不一致"
?控制臺運行結果
日志收集文件里的存儲結果
3、鉤子函數
鉤子函數放在conftest.py文件里
pytest官網:pytest: helps you write better programs - pytest documentation
return永遠不執行后面的
迭代器會往復執行
二、所有接口的區別?
接口四要素不同--數據提取出來--就是數據驅動(DDT)
"數據驅動測試"(Data-Driven Testing,簡稱DDT)是一種軟件測試方法,使用不同的數據集來驅動測試用例的執行。通過將測試數據與測試邏輯分離,DDT可以提高測試覆蓋率、增強測試代碼的可維護性,并減少重復代碼。
1、數據格式
把所有的數據進行提取 - DDT(數據驅動)格式:
單元素:每次拿一個數據(有多少個就多少次)
()--元組,無序
[] --列表 ,有序
{}--字典 , 有序(python3.7開始字典有序,之前的無序)嵌套元素:每次拿一組數據,要取其中的值(可以通過下標去獲取)
([],[])--元組里套列表
[(),()] --列表里套元組,因為元組無序,所以這個不能通過下標獲取
[{},{}] --列表套字典- 用的最多的一種格式 方法:--裝飾器
@pytest.mark.parametrize("變量名",數據源)在運行過程當中,數據源有多少個就會執行多少次
1)單元素數據驅動
data1 = ("hami", "xiaomi", "sanfeng")? 元組類型
獲取元素的坐標結果
2)嵌套元素數據--列表里套元組
data2 = [("hami","123456"),("xiaomi","111111"),("sanfeng","22222")]
通過下標獲取其一數據
?3)嵌套元素數據--列表里套字典
data3 = [{"name": "hami", "password": "123456"}, {"name": "xiaomi", "password":"11111"},{"name": "sanfeng", "password": "222222"}]
三、接口自動化用例模板的編寫
要求:
1、編號和行號一致
?
2、 標黃色都是必填
3、請求數據的參數類型
data是表單形式提交,Json是請求頭是json的去提交,files是上傳文件的接口需要使用
4、斷言的字段
5、程序執行完,自動回寫的數據
四、讀取文件的程序-FileDataDriver.py
用來讀取和寫入excel \ yaml文件。
利用數據驅動,把excel文件讀取成功
五、config.py
用來存放常用的變量(文件路徑、讀取的sheet頁),其中,常量要大寫
要從文件的根目錄的下一級開始讀取文件,所以,config.py文件要在文件的根目錄的下一級
如圖,是day06.P06_PytestFrame
自己的代碼-根目錄是day06,下一級是P06_PytestFrame
?
下載指令:pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
六、data的路徑
下面這些文件是在同一級目錄里
?
如果是基于上一層目錄下的一層(在二級目錄里),則是../
如果只是處于同級目錄,是./
七、核心執行器--testcase
拿到數據,進行解析,發送請求
1、反射
class ApiKey:name = "hami"def get(self):print("這是get方法")def post(self, url, data):print("這是post方法")print("url", url)print("data", data)return "ok"# 反射:通過[類(實例化對象)和方法名]找到對應的方法
# 反射的語法:getattr(實例化對象, 方法名/屬性名)**參數 ,返回值:方法本體ak = ApiKey()
method = "post"
method_fun = getattr(ak, method)#(類,方法)
method_fun(url="1111",data="2222")
tips:
# eval() # 把字符串 轉成[有效的表達式]
#
# a = "1+2"
# print(eval(a)) #3# data = "{'name':'hami'}"
# print(type(eval(data))) #dict
?2、斷言
拿到響應數據,和預期數據,斷言比較?
?3、動態生成標題:
使用固定的方法,動態生成標題?
?
然后生成的標題
?