注:關於pytest的基礎要點個人已經總結好了,直接git clone即可,gitee:https://gitee.com/teark/pytest_exercise.git
啟動:
在main下,pytest.main(['-q','test_demo.py'])
或者在終端,pytest ./test_demo.py
執行多個:pytest test_fixture1.py test_fixture2.py
啟動參數說明:
-s: 顯示程序中的print/logging輸出
-v: 豐富信息模式, 輸出更詳細的用例執行信息
-q: 安靜模式, 不輸出環境信息,只給結果
-k:關鍵字匹配,用and區分:匹配范圍(文件名、類名、函數名)
setup/teardown:
setup_class和teardown_class函數:運行在類的始末
pytest.ini:
參數最好都放配置文件里,不用再main里放
testpaths配置測試搜索的路徑
python_files配置測試搜索的文件名
python_classes配置測試搜索的測試類名
python_functions配置測試搜索的測試函數名
配置文件里不要出現中文,需要gbk編碼,但是改了gbk,控制台打印時會報錯,無語。
pytest-html:
用法:配置文件里添加報告參數:addopts = -s --html=./report.html,若要生成xml文件改一下就行
pytest-ordering:
安裝它
用法:函數上面加@pytest.mark.run(order=n)
優先級:order值全為正數或全為負數時, 值越小,優先級越高;正數和負數同時存在,正數優先級高
pytest-rerunfailures:
安裝它
用法:命令行格式, pytest —reruns n # n為重試的次數;或添加失敗重試參數,即:addopts = -s --reruns 2 --html=./report.html
記住命令行是reruns,最好配置參數
fixture:
功能:通常會被用於完成預置處理和重復操作。如在測試網站的功能時,每個測試用例都要登錄和退出,利用fixture就可以只做一次;完成setup和
teardown操作,處理數據庫或文件的打開、關閉操作;將數據提前寫入數據庫或通過params返回給測試用例。強大吧!
pytest.fixture(scope='function', params=None, autouse=False, ids=None, name=None)
常用參數解釋:
"scope": 被標記方法的作用域;
"function": 默認值,表示每個測試方法都要執行一次
"class": 作用於整個類, 表示每個類的所有測試方法只運行一次
"module": 作用於整個模塊, 每個module的所有測試方法只運行一次.
"session": 作用於整個session, 每次session只運行一次. ⚠️(此方法慎用!!)
params: list類型,默認None, 接收參數值,對於param里面的每個值,fixture都會去遍歷執行一次.
autouse: 是否自動運行,默認為false, 為true時此session中的所有測試函數都會調用fixture
以上的所有參數也可以不傳
使用:
把返回值作為參數使用:某個功能函數如before上面放@pytest.fixture(),然后before可以作為參數放在需要用的函數里,選這個沒錯了。
直接使用:某個功能函數如before上面放@pytest.fixture(),然后需要用的函數或類上面放@pytest.mark.usefixtures("before")
skipif:
@pytest.mark.skipif(condition, reason=None)
參數解釋:
condition: 跳過的條件,必傳參數
reason: 標注原因,必傳參數
xfail:
@pytest.mark.xfail(condition=None, reason=None, raises=None, run=True, strict=False)
常用參數:
condition:預期失敗的條件,必傳參數
reason:失敗的原因,必傳參數
parametrize:
@pytest.mark.parametrize(argnames,argvalues)
參數值為N個,測試方法就會運行N次
常用參數:
argnames:參數名
argvalues:
參數對應值,類型必須為list
當參數為一個時,參數格式:[value]
當參數個數大於一個時,格式為:[(param_value1,param_value2.....),(param_value1,param_value2.....)]
運行:
pytest.main("d:/pyse/pytest/") # 指定測試目錄
pytest.main("-q test_main.py") # 指定測試文件
pytest.main("-v -s spec_001_modul_test.py::test_001_spec") #運行模塊中指定用例
pytest.main("-v -s spec_001_modul_test.py::Test_Class::test_003_spec") #運行類中指定用例
#運行spec_001_modul_test模塊中用例名稱包含spec的用例
pytest.main("-v -s -k spec spec_001_modul_test.py")
#運行當前文件夾匹配Test_Class的用例,類文件下面的用例
pytest.main('-s -v -k Test_Class')
pytest 目錄/文件::類名::函數名 或者 pytest 目錄/文件::函數名
其他:
不需要在main里面寫pytest.main,只要是符合命名,默認為pytest啟動,都會自動調用pytest
如果兩個測試函數體里面的內容一樣,只會輸出一次結果。
改了哪兒,直接運行后測的就是哪兒。需要重新定位鼠標,一般放最后。這條很重要!
斷言對比
unittest(3種):
assertIn(expect,result)斷言包含(被包含的寫前面)
assertEqual(expect,result)斷言相等
assertTure(條件)斷言是否為真。返回Ture或False
pytest(5種,即python里的斷言)
assert xx:判斷xx為真
assert not xx:判斷xx不為真
assert a in b:判斷b包含a
assert a == b:判斷a等於b
assert a !=b,"判斷a不等於b"(加上括號后面有說明)
后記
如果哪里不明白可以留下你的評論,如果覺得對你有幫助,記得關注我哦!pytest基本使用練習地址:https://gitee.com/teark/pytest_exercise.git,歡迎mark!