?🍅?點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快?
1、基于pytest單元測試框架的規則
1.1 模塊名(即文件名)必須以test_開頭或者_test結尾
1.2 類名必須以Test開頭且不能有init方法
1.3 用例名(測試方法)必須以test開頭
2、項目實戰
import pytest as pytest
import requests# 此案例測試用例之間無法關聯cookie信息
class TestApi:# 類變量也叫全局變量access_token = ""# 獲取鑒權碼def test_get_token(self):url = "https://api.weiixn.com/token"datas = {"grant_type": "client_credential","appid": "wx32497320974","secret": "dh2983yr4fh9734."}res = requests.get(url=url, params=datas)result = res.json()TestApi.access_token = result["access_token"]# jsonpath提取實現接口關聯# lis = jsonpath.jsonpath(res.json(), "$.access_token")# print(lis[0])# re正則表達式提取# token = re.search('name="hduwqidh" value="(.*?)"', res.text).group(1)# 編輯標簽接口def test_edit_flag(self):url = "https://api.weiixn.com/update?access_token=" + TestApi.access_tokenheaders = {}# json是字典的字符串格式,兩者可以相互轉換json = {}# 鍵值對data = Noneres = requests.post(url=url, json=json, headers=headers)# 文件上傳def test_file_upload(self):url = "https://api.weiixn.com/update?access_token=" + TestApi.access_tokendatas = {# 文件路徑也可以寫為open("D:\\snipaste")"media": open(r"D:\snipaste", mode="rb")}res = requests.post(url=url, files=datas)if __name__ == '__main__': # 入口pytest.main('-vs')
3、pytest的main使用
3.1 pytest.main() 運行模式時,main()不添加任何參數,表示運行當前目錄下的所有的測試文件
3.2 main()添加參數如下:
- ? ?pytest.main(['-s', '-v', '-q', '-x','-k "print"'])
- ? ?-s ? 對于代碼里print語句會將輸出至控制臺
- ? ?-v ? 用于增加測試用例的冗長
- ? ?-q ? 用于減少測試用例的執行結果的冗長
- ? ?-x ? 出現一條用例執行失敗就退出測試,調試階段常用
- ? ?-k "print" ?運行包含某個字符串的用例,如pytest -k add XX.py 表示運行XX.py中包含add的測試用例等等 ??
3.3 執行測試用例的過濾
執行某個測試類或測試方法用 :: 隔開,常用-vs參數
pytest.main(["-vs","模塊.py::類或方法"]) ??
命令行為:pytest 文件名.py::測試類或測試方法
pytest.main(["-vs","模塊.py::類::方法"]) ??
命令行為:pytest 文件名.py::測試類::測試方法
如果是在main目錄入口執行測試用例文件:
import pytest
if __name__ == '__main__':
? ? pytest.main(["-vs","--html=../../report_hdc/20211011_hdc_02.html","--self-contained-html"])
3.4 如果使用pytest.main()生效,再pycharm中必須設置Tools>Python Integrated Tools>Default test runner=Unittests;如果設置為pytest則是無效的。
3.5 在pytest中,測試函數可能返回多種結果,不只是通過或失敗。如下:
PASSED(.):測試通過
FAILED(F):測試失敗
SKIPED(s):測試未被執行,指定測試跳過執行
xfail (x):預期測試失敗,并且確實失敗
XPASS (X):預期測試失敗,但實際上運行通過,不符合預期
ERROR (E):測試用例之外的代碼觸發的異常
3.6 pytest.main(["-m", "run_first"])
使用-m 對用例進行標記,用例需注釋@pytest.mark.xxx,將xxx作為參數傳入
使用-m "mark1 and mark2"可以同時選中帶有這兩個標記的所有測試用例。
使用-m "mark1 and not mark2"選中帶有與mark1的測試用例,而過濾掉帶有mark2的測試用例
使用-m "mark1 or mark2"則選中帶有mark1或者mark2的所有測試用例?
4、接口關聯
4.1 三個層次
4.1.1 通過類變量保存中間變量實現接口關聯
4.1.2 通過單獨的文件保存中間變量實現接口關聯
4.1.3 極限封裝成零代碼的方式實現接口關聯
4.2 兩種方式
4.2.1 正則提取實現接口關聯
re.search() #通過正則匹配一個值,通過下標[1]取值,沒有匹配到返回none
re.findall() #通過正則匹配多個值,返回List,通過下標取值,沒有匹配到返回none
4.2.2 jsonpath提取實現接口關聯
jsonpath.jsonpath() #返回一個列表,通過下標取值,沒有找到返回none
5、總結?
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
這些資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。