pytest.ini:pytest的主配置文件,可以改變pytest的默認(rèn)行為炉抒,有很多可配置的選項(xiàng)球拦。
conftest.py:是本地的插件庫置森,其中的hook函數(shù)和fixture將作用于該文件所在的目錄以及所有子目錄肥矢。
init.py:每個(gè)測試子目錄都包含該文件時(shí)绩脆,那么在多個(gè)測試目錄中可以出現(xiàn)同名測試文件。
常用配置:
1橄抹、addopts
作用:addopts參數(shù)可以更改默認(rèn)命令行選項(xiàng),當(dāng)我們在cmd或Terminal輸入一堆指令去執(zhí)行用例的時(shí)候惕味,就可以用該參數(shù)代替了楼誓,省去重復(fù)性的敲命令工作。命令行只需要輸入pytest即可
--reruns=1:用例失敗重跑一次
-p no:warnings, :不在結(jié)果中輸出用例的告警信息
2名挥、配置項(xiàng)testpaths
testpaths指示pytest去哪里訪問疟羹。testpaths是相對于根目錄的路徑,限定測試用例的搜索范圍禀倔。只有在命令行執(zhí)行pytest未指定文件目錄參數(shù)或測試用例標(biāo)識符時(shí)榄融,該選項(xiàng)才生效。
3救湖、xfail_strict = true
由@pytest.mark.xfail裝飾愧杯,但實(shí)際通過的測試用例結(jié)果為xpassed的用例被報(bào)告為失敗,如下test_5所示:
@pytest.mark.run(order=5)
@pytest.mark.xfail(condition=True,reason='test_s預(yù)期失敗結(jié)果也失敗鞋既,就是預(yù)期失敗成功了力九,結(jié)果xfailed')
def test_2(self):
print("*****test_2******")
assert 2==1
@pytest.mark.xfail(condition=True,reason='test_s預(yù)期失敗卻通過,就是預(yù)期失敗失敗了xpassed')
def test_5(self):
print("*****test_5******")
assert 2==2
4邑闺、log_cli 是否開啟打印日志
格式:log_cli=True 或False(默認(rèn))跌前,或者log_cli=1 或 0 ;log_cli=1 可以看到哪個(gè)package下的哪個(gè)module下的哪個(gè)測試用例是否passed還是failed陡舅;
log_cli = 1
log_cli_level = INFO
log_cli_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)
log_cli_date_format=%Y-%m-%d %H:%M:%S
************************************pytest 知識點(diǎn)匯總************************************
單元測試框unittest,pytest
unittest是官方的抵乓,不需要單獨(dú)安裝,pytest是在unittest上擴(kuò)展的,是需要安裝的
pip install pytest
如何批量運(yùn)行測試用例
如何斷言
怎樣生成測試報(bào)告(可以是html灾炭,或aller集成)
基于上面的3個(gè)問題茎芋,引入了單元測試框架unittest、pytest
一咆贬、pytest特點(diǎn)如下(比unittest更簡潔更高效):
1败徊、測試文件必須“test_”開頭或“test”結(jié)尾
2、測試方法必須以“test”開頭
3掏缎、測試類命名以"Test"開頭
區(qū)別:
unittest必須寫到類里皱蹦,類繼承unittest.testcases,pytest的類直接Test開頭即可,還可以直接寫函數(shù)
二眷蜈、fixture函數(shù)
1沪哺、setup_function() 函數(shù)執(zhí)行前的操作
2、setup_module() 模塊之前酌儒,python文件之前
3辜妓、setup_method() 在方法之前執(zhí)行
4、setup_class() 在每個(gè)類之前執(zhí)行
如果是unittest的話忌怎,需要裝飾器 如下所示:
class Test(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("start!")
#初始化環(huán)境 開始執(zhí)行腳本
@classmethod
def tearDownClass(cls):
time.sleep(1)
print("end!")
#結(jié)束
def test01(self):
print(u"執(zhí)行測試用例01")
#開始執(zhí)行測試用例...
def test03(self):
print(u"執(zhí)行測試用例03")
def test02(self):
print(u"執(zhí)行測試用例02")
def addtest(self):
print(u"add方法")
if __name__ == "__main__":
unittest.main()
三籍滴、命令行參數(shù)
pytest -sv test_study.py -s會把print打印出來,v打印的更詳細(xì)
四榴啸、失敗重試
pip install pytest-rerunfailures
命令行加參數(shù)即可 --reruns 3 (重試3次)
pytest -sv test_study.py --reruns 2 斷言失敗重試2次
五孽惰、跳過測試函數(shù)
加裝飾器
@pytest.mark.skipif(condition,reason=None) 有條件跳過
@pytest.mark.skip 無條件跳過
六、預(yù)期失敗
@pytest.mark.xfail(condition,reason=None)
2 passed, 1 skipped, 1 xpassed, 1 xfailed, 1 warning in 0.04s 運(yùn)行結(jié)果中的xpassed是預(yù)期失敗卻斷言成功了; xfailed預(yù)期失敗卻斷言失敗了,
七鸥印、調(diào)整測試用例執(zhí)行的順序(正常執(zhí)行順序是按asc碼云運(yùn)行的勋功,)
pip install pytest-ordering
加裝飾器 @pytest.mark.run(order=x)
order值全正或全負(fù)時(shí),值越小库说,優(yōu)先級越高
正負(fù)數(shù)都有時(shí)狂鞋,正數(shù)優(yōu)先級高