婚姻介紹交友網(wǎng)站怎么建設(shè)百度推廣助手客戶端
pytest安裝
安裝 pip install -U pytest
驗證安裝 pytest --version
約束:
所有的測試文件名都需要滿足test_ *.py格式或* _test.py格式。
測試文件中的測試類以Test_開頭,并且不能帶有 init 方法。
測試類中可以包含一個或多個test_開頭的函數(shù)。
步驟:編寫測試用例、執(zhí)行測試用例、輸出測試報告
import pytest #文件名test_try.py
class Test_py:def test_01(self):print('test001')def test_02(self):print('test002')
pytest的main方法
-
直接執(zhí)行pytest.main()
- 自動查找當(dāng)前目錄下,以test_開頭的文件或者以_test結(jié)尾的py文件;
-
設(shè)置pytest的執(zhí)行參數(shù)
- pytest.main([‘–html=./report.html’,‘test_login.py’])
- 執(zhí)行test_login.py文件,并生成html格式的報告。
-
main()括號內(nèi)可傳入執(zhí)行參數(shù)和插件參數(shù),通過[]進(jìn)行分割,[]內(nèi)的多個參數(shù)通過‘逗號,’進(jìn)行分割:
-
運行目錄及子包下的所有用例 pytest.main([‘目錄名’])
-
運行指定模塊所有用例 pytest.main([‘test_reg.py’])
-
運行指定模塊指定類指定用例 pytest.main([‘test_reg.py::TestClass::test_method’]) 冒號分割
-
-m=xxx: 運行打標(biāo)簽的用例
–lf :運行上次失敗的用例 last failure
–ff:運行上次的用例,先執(zhí)行上次失敗的 failed first
-reruns=xxx:失敗重新運行 !!!
-q: 安靜模式, 不輸出環(huán)境信息
-v: 豐富信息模式, 輸出更詳細(xì)的用例執(zhí)行信息 用例所在文件和用例名稱
-s: 顯示程序中的調(diào)試信息 比如print/logging輸出
–junitxml=./log.xml 生成xml報告
-k:執(zhí)行用例包含關(guān)鍵字的用例,關(guān)鍵字用雙引號 pytest -k “2” .\shishi\test_assert.py
-x: 執(zhí)行失敗就停止執(zhí)行,之后的用例不被執(zhí)行
1.運行指定案例:
if __name__ == '__main__':pytest.main(["-v","-s","test_1214.py"])
2.運行當(dāng)前文件夾包括子文件夾所有用例:
if __name__ == '__main__':pytest.main(["-v","-s","./"])
3.運行指定文件夾(code目錄下所有用例):
if __name__ == '__main__':pytest.main(["-v","-s","code/"])
4.運行模塊中指定用例(運行模塊中test_add用例):
if __name__ == '__main__':pytest.main(["-v","-s","test_pytest.py::test_add"])
5.執(zhí)行失敗的最大次數(shù)
使用表達(dá)式"–maxfail=num"來實現(xiàn)(注意:表達(dá)式中間不能存在空格),表示用例失敗總數(shù)等于num 時停止運行。
if __name__ == '__main__':pytest.main(["-v","--maxfail=2","test_pytest.py::test_add"])
6.錯誤信息在一行展示
在實際項目中如果有很多用例執(zhí)行失敗,查看報錯信息將會很麻煩。使用"–tb=line"命令。
if __name__ == '__main__':pytest.main(["-v","--tb=line","test_pytest.py::test_add"])
7.運行打標(biāo)簽的用例 函數(shù)前加@pytest.mark.biaoqian ,biaoqian是標(biāo)簽名 使用“-m=xxxxx”命令,只執(zhí)行帶有標(biāo)簽的用例
import pytest #導(dǎo)入pytest包
str = "PHP/JAVA/PYTHON"
@pytest.mark.biaoqian
def test_in1():assert "PH" in str #true
def test_in2():assert "PI" in str #false
def test_is1():assert "PHP/JAVA/PYTHON" is str #true
@pytest.mark.biaoqian
def test_is2():assert "PHP" is str #false
if __name__ == '__main__':pytest.main(['-v','-m=biaoqian','test_assert.py'])
8.執(zhí)行失敗就停止執(zhí)行 使用-x
if __name__=='__main__':pytest.main(['-v','-x','test_assert.py'])
9.執(zhí)行上次執(zhí)行中失敗的用例 使用 --lf
if __name__=='__main__':pytest.main(['-v','--lf','test_assert.py'])
10.執(zhí)行上次執(zhí)行的用例,先執(zhí)行失敗的 使用 --ff
if __name__=='__main__':pytest.main(['-v','--ff','test_assert.py'])
斷言方法
pytest斷言主要使用Python原生斷言方法,主要有以下幾種:
- assert xx:判斷 xx 為真
- assert not xx:判斷 xx 不為真
- assert a in b:判斷 b 包含 a (實際結(jié)果包含預(yù)期結(jié)果)
- assert a == b:判斷 a 等于 b (內(nèi)容和類型必須同時滿足相等)
- assert a !=b:判斷 a 不等于 b
- assert a is b 判斷a和b是相等的 (斷言前后兩個值相等)
測試用例的執(zhí)行
-
使用命令行執(zhí)行指定文件
cmd中執(zhí)行 pytest test_try.py
cmd中執(zhí)行pytest 執(zhí)行當(dāng)前文件夾下所有test_或者_(dá)test的文件
-
使用命令行執(zhí)行文件的制定方法
cmd中執(zhí)行 pytest test_try.py::Test_py::test_01 文件名::類名::方法名
跳過用例的執(zhí)行
- @pytest.mark.skipif(condition,reason=“xxx”)
- condition 跳過的條件,reason為原因必填
- @pytest.mark.skip()
import pytest #導(dǎo)入pytest包
@pytest.mark.skip()
def test_001(): #函數(shù)以test_開頭print("test_001")
@pytest.mark.skipif(1==1,reason="tiaoguo222")
def test_002():print("test_002")
if __name__=='__main__':pytest.main(['-v','test_0102.py'])
標(biāo)記為預(yù)期失敗的用例
- @pytest.mark.xfail(condition,reason=“xxx”)
- condition預(yù)期失敗的條件,reason為原因必填
- xfail如果pass就是xpass,如果fail就是xfail
import pytest #導(dǎo)入pytest包
str = "PHP/JAVA/PYTHON"
@pytest.mark.xfail()
def test_in1():assert "PH" in str #true
def test_in2():assert "PI" in str #false
def test_is1():assert "PHP/JAVA/PYTHON" is str #true
@pytest.mark.xfail(1==1,reason="shibai is2")
def test_is2():assert "PHP" is str #false
if __name__=='__main__':pytest.main(['-v','test_assert.py'])
#結(jié)果 xpass fail pass xfail
參數(shù)化
- @pytest.mark.parametrize(argnames,argvalues) 參數(shù)名,參數(shù)值
- @pytest.mark.parametrize(“a”,[3,6])單參數(shù)
- 參數(shù)值多個,測試方法就運行多個。如上,運行兩次
- @pytest.mark.parametrize(“a,b”,[(1,2),(0,3)])多參數(shù)
import pytest
class Test_parametrize:@pytest.mark.parametrize('a,b',[(1,3),(2,4)])def test_aaa(more,a,b): print("輸出兩個值:",a,b)@pytest.mark.parametrize("x",[1,2])def test_bbb(self,x):print("輸出值:",x)
if __name__=='__main__':pytest.main(['-v','-s','test_parametrize.py'])
執(zhí)行標(biāo)記的用例多次
- @pytest.mark.repeat(n) 執(zhí)行當(dāng)前用例 n 次 然后繼續(xù)往下執(zhí)行其他用例
import pytest
@pytest.mark.repeat(5)
def test_001():print("test_001")
if __name__=='__main__':pytest.main(['-v','test_repeat.py'])
設(shè)置用例執(zhí)行的順序
- @pytest.mark.last–最后一個執(zhí)行
- @pytest.mark.run(order=1)—第幾個執(zhí)行
import pytest
@pytest.mark.run(order=1)
def test_001():print("test_001")
@pytest.mark.last()
def test_002():print("test_002")
@pytest.mark.run(order=2)
def test_003():print("test_003")
if __name__=='__main__':pytest.main(['-v','test_ordering.py'])
生成測試報告
- html報告 ‘–html=./test_para.html’
- xml報告 ‘–junit-xml=./test_para.xml’
if __name__=='__main__':pytest.main(['-v','-s','--junit-xml=./test_para.xml','test_parametrize.py'])#pytest.main(['-v','-s','--html=./test_para.html','test_parametrize.py'])