pytest是一個非常成熟的全功能的python測試框架,主要有以下幾個特點:
- 簡單靈活,容易上手
- 支持參數化
- 能夠支持簡單的單元測試和復雜的功能測試,還可以用來做selenium/appium等自動化測試,接口自動化測試(pytest+request)
- pytest具有很多第三方插件,並且可以自定義擴展,比較好用的如pytest-selenium(集成selenium)、pytest-html(完美html測試報告生成)、pytest-rerunfailures(失敗case重復執行)、pytest-xdist(多CPU分發)等
- 測試用例的skip和xfail處理
- 可以很好的和Jenkins集成
- report框架----allure 也支持了pytest
1.Pytest安裝
- 安裝
pip install -U pytest
2.驗證安裝
pytest --version #會展示當前自己安裝的版本
3.pytest文檔
官方文檔:https://docs.pytest.org/en/latest/contents.html
在pytest框架中,有如下約束:
- 所有的單測文件名都需要滿足test_*.py格式或*_test.py格式。
- 在單測文件中,測試類以Test開頭,並且不能帶有 init 方法(注意:定義class時,需要以T開頭,不然pytest是不會去運行該class的)
- 在單測類中,可以包含一個或多個test_開頭的函數。
- 此時,在執行pytest命令時,會自動從當前目錄及子目錄中尋找符合上述約束的測試函數來執行。
4. Pytest運行方式
# file_name: test_abc.py import pytest # 引入pytest包 def test_a(): # test開頭的測試函數 print("------->test_a") assert 1 # 斷言成功 def test_b(): print("------->test_b") assert 0 # 斷言失敗 if __name__ == '__main__': pytest.main(["-s","test_abc.py"]) # 調用pytest的main函數執行測試
- 測試類主函數
pytest.main(["-s","test_abc.py"])
通過python代碼執行 pytest.main() 1.直接執行pytest.main() 【自動查找當前目錄下,以test_開頭的文件或者以_test結尾的py文件】 2.設置pytest的執行參數 pytest.main(['--html=./report.html','test_login.py'])【執行test_login.py文件,並生成html格式的報告】 main()括號內可傳入執行參數和插件參數,通過[]進行分割,[]內的多個參數通過‘逗號,’進行分割 運行目錄及子包下的所有用例 pytest.main(['目錄名']) 運行指定模塊所有用例 pytest.main(['test_reg.py']) 運行指定模塊指定類指定用例 pytest.main(['test_reg.py::TestClass::test_method']) 冒號分割 -m=xxx: 運行打標簽的用例 -reruns=xxx,失敗重新運行 -q: 安靜模式, 不輸出環境信息 -v: 豐富信息模式, 輸出更詳細的用例執行信息 -s: 顯示程序中的print/logging輸出 --resultlog=./log.txt 生成log --junitxml=./log.xml 生成xml報告
- 命令行模式
pytest 文件路徑/測試文件名 例如:pytest ./test_abc.py
或者直接輸入pytest也可以執行
5.Pytest Exit Code 含義清單
- Exit code 0 所有用例執行完畢,全部通過
- Exit code 1 所有用例執行完畢,存在Failed的測試用例
- Exit code 2 用戶中斷了測試的執行
- Exit code 3 測試執行過程發生了內部錯誤
- Exit code 4 pytest 命令行使用錯誤
- Exit code 5 未采集到可用測試用例文件
6. 如何獲取幫助信息
查看pytest版本
pytest --version
顯示可用的內置函數參數
pytest --fixtures
通過命令行插件幫助信息及配置文件選項
pytest --help
7. 控制測試用例執行
在第N個用例失敗后,結束測試執行
pytest -x #第01次失敗就停止測試 pytest --maxfail=2 #出現2個失敗就終止測試
# file_name: test_abc.py import pytest # 引入pytest包 def test_a(): # test開頭的測試函數 print("------->test_a") assert 1 # 斷言成功 def test_b(): print("------->test_b") assert 0 # 斷言失敗 def test_c(): print("------->test_c") assert 0 # 斷言失敗 def test_d(): print("------->test_d") assert 0 # 斷言失敗 if __name__ == '__main__': pytest.main(["-s","test_abc.py"]) # 調用pytest的main函數執行測試
通過node id指定測試用例
node id 由模塊文件名,分隔符,類名,方法名,參數構成
運行模塊中的指定用例
pytest test_mod.py::test_func:
pytest test_abc.py::test_a
運行模塊中的指定方法
pytest test_mod.py::TestClass::test_method :
pytest test_abc.py::Test_Class::test_c
import pytest def test_a(): assert 1 def test_b(): assert 0 class Test_Class(): def test_c(self): assert 1 if __name__ == '__main__': pytest.main(["-s","test_abc.py"])
通過標記表達式執行
pytest -m slow
這條命令會執行被裝飾器 @pytest.mark.slow 裝飾的所有測試用例
通過包執行測試
pytest --pyargs pkg.testing
這條命令會自動導入包 pkg.testing,並使用該包所在的目錄,執行下面的用例。
8.多進程運行cases
當cases量很多時,運行時間也會變的很長,如果想縮短腳本運行的時長,就可以用多進程來運行。
安裝pytest-xdist:
pip install -U pytest-xdist
運行模式:
pytest test_se.py -n NUM
其中NUM填寫並發的進程數。
9.重試運行cases
在做接口測試時,有事會遇到503或短時的網絡波動,導致case運行失敗,而這並非是我們期望的結果,此時可以就可以通過重試運行cases的方式來解決。
安裝pytest-rerunfailures:
pip install -U pytest-rerunfailures
運行模式:
pytest test_se.py --reruns NUM
NUM填寫重試的次數。
10.顯示print內容
在運行測試腳本時,為了調試或打印一些內容,我們會在代碼中加一些print內容,但是在運行pytest時,這些內容不會顯示出來。如果帶上-s,就可以顯示了。
運行模式:
pytest test_se.py -s
另外,pytest的多種運行模式是可以疊加執行的,比如說,你想同時運行4個進程,又想打印出print的內容。可以用:
pytest test_se.py -s -n 4
11,pytest參數
1、-K EXPRESSION
執行某個關鍵字的用例
用例要匹配給出的表達式;使用python的語法,匹配的范圍是文件名、類名、函數名為變量,用and來區分
2、--maxfail=num
當錯誤個數到達給定數時,退出測試,這里就不列舉實例了,結果與-x類似
只能運行有相應標識的測試用例,使用這個參數,測試用例要使用@pytest.mark.marker修飾
4、 -v, --verbose
詳細結果
極簡結果顯示,簡化控制台的輸出,可以看出輸出信息和之前不添加-q不信息不一樣, 下圖中有兩個..點代替了pass結果
輸入我們用例中的調式信息,比如print的打印信息等,我們在用例中加上一句 print(driver.title),我們再運行一下我們的用例看看,調試信息輸出
可以輸出用例更加詳細的執行信息,比如用例所在的文件及用例名稱等
輸出xml文件格式,在與jenkins做集成時使用
將最后的結果保存到本地文件中
注意:標黃的是經常使用的