一、pytest 單元測試框架
1、什麼是單元測試,針對軟體的最小單位(函式,方法,介面)進行正確性的檢查測試。
2、單元測試框架(按語言分)
java : junit 和testing
python : unittest 和 pytest
3、單元測試主要是做什麼呢?
(1)、測試發現:從多個檔案裡面去找到測試用例
(2)、測試執行:按照一定的順序和規則去執行。並生成結果
(3)、測試判斷:透過斷言判斷預期結果和實際結果的差異
(4)、測試報告:測試統計進度,耗時,透過率,生成測試報告
二、pytest簡介
1、pytest是一個非常成熟的python的單元框架,比unittest更靈活,容易上手。
2、pytest可以和selenium,requests,applum結合實現web自動化,介面自動化,app自動化
3、pytest可以實現測試用例的跳過以及reruns失敗用例重試
4、pytest可以和allure生成非常美觀的測試報告
5、pytest可以和Jenkins持續整合
6、pytest有很多強大的外掛,並且這些外掛能夠實現很多的使用的操作
例如:
pytest
pytest-xdist -- 測試用例分散式執行,多CPU分發
pytest-ordering -- 用於改變測試用例的執行順序
pytest-rerunfailures -- 用例失敗後重跑
pytest-html -- 生成html格式的自動化測試報告
allure-pytest -- 用於生成美觀的測試報告
三、使用pytest,預設的測試用例的規則以及基礎應用
1、模組名必須以test_開頭或者_test結尾
2、測試類必須以Test開頭,並且不能用init方法
3、測試方法必須以test開頭
四、pytest 測試用例的執行方式
1、主函式模式
(1)執行所有:pytest.main()
(2)指定模組:pytest.main(['-vs','test_login.py'])
(3)指定目錄:pytest.main(['-vs','/interface'])
(4)透過nodeid指定用例執行:nodeid由模組名,分隔符,類名,方法名,函式名組成
pytest.main(['-vs','/interface/test_login.py:test_01'])
2、命令列模式
(1)執行所有:pytest
(2)指定模組:pytest -vs test_login.py
(3)指定目錄:pytest -vs /interface
引數詳解:
-s:表示輸出除錯資訊,包含print列印的資訊
-v:顯示更多的資訊
-vs:上面兩個引數一起用
-n:支援多執行緒或者分散式執行測試用例
例:pytest -vs /interface/test_login.py -n 2 (分兩個執行緒)
--reruns num:失敗用例重跑(num重跑次數)
-x:表示只要一個用例報錯,測試停止
--maxfail=2 出現兩個用例失敗停止
-k:根據測試用例的部分字串指定測試用例
例:pytest -vs 。/interface -k "ao"
--html ./interface/interface.html:在interface目錄下生成html的測試報告
3、透過讀取pytest.ini配置檔案執行
pytest.ini檔案是pytest單元測試框架的核心配置檔案
(1)、位置:一般在專案的根目錄
(2)、編碼:必須是ANSI,可以使用notpad++修改編碼格式
(3)、作用:改變pytest預設的行為
(4)、執行的規則:不管是主函式模式執行,命令列模式也能行,都會去讀取這個配置檔案
例:
[pytest]
addopts = -vs --html ./report.html -- 引數
testpaths = ./web -- 測試用例路徑
python_files = test_*.py -- 模組名的規則
python_classes = Test* -- 類名的規則
pythonn_functions = test -- 方法名規則
markers = -- 標記用例
smoke:冒煙測試
五、pytest 用例的執行順序是怎麼樣的?
unittest 以ASCLL的大小來執行
pytest預設從上到下
改變預設執行順序,就用mark標記
例:@pytest.mark.run(order = 3)
六、如何分組執行(冒煙,分模組執行,分介面和web執行)
smoke:貓眼用力,分佈在各個模組
pytest -m "smoke" -- 就會執行帶有smoke標記的模組
pytest -m "smlke or smoke ir smoke2" -- 執行多個
七、pytest跳過測試用例
1、無條件跳過
@pytest.mark.skip(reason = "單純想跳過")
2、有條件跳過
@pytest.mark.skip(age>18,reason = "跳過年紀大於18的")