1、fixture之a(chǎn)utouse=True
調(diào)用fixture三種方法
1)函數(shù)或類(lèi)里面方法直接傳fixture的函數(shù)參數(shù)名稱(chēng)
2)使用裝飾器@pytest.mark.usefixtures()修飾
3)autouse=True自動(dòng)使用(autouse,默認(rèn)是Fasle沒(méi)開(kāi)啟的)

2、配置文件pytest.ini
pytest里面有些文件是非test文件:
pytest.ini pytest的主配置文件,可以改變pytest的默認(rèn)行為
conftest.py 測(cè)試用例的一些fixture配置
__init__.py 識(shí)別該文件夾為python的package包
tox.ini 與pytest.ini類(lèi)似,用tox工具時(shí)候才有用
setup.cfg 也是ini格式文件,影響setup.py的行為
ini文件基本格式:
# 保存為pytest.ini文件
[pytest]
addopts = -rsxX
xfail_strict = true
--rsxX 表示pytest報(bào)告所有測(cè)試用例被跳過(guò)、預(yù)計(jì)失敗、預(yù)計(jì)失敗但實(shí)際被通過(guò)的原因
多個(gè)標(biāo)簽寫(xiě)入ini文件內(nèi):
markers =
webtest: Run the webtest case
hello: Run the hello case
標(biāo)記好之后,可以使用pytest --markers查看到
禁用xpass
設(shè)置xfail_strict = true可以讓那些標(biāo)記為@pytest.mark.xfail但實(shí)際通過(guò)的測(cè)試用例被報(bào)告為失敗
addopts:
addopts參數(shù)可以更改默認(rèn)命令行選項(xiàng),這個(gè)當(dāng)我們?cè)赾md輸入指令去執(zhí)行用例的時(shí)候,會(huì)用到,比如我想測(cè)試完生成報(bào)告,指令比較長(zhǎng)
pytest -v --rerun 1 --html=./report/report.html --self-contained-html
3、doctest測(cè)試框架
文檔測(cè)試:是單元測(cè)試的一種
doctest測(cè)試用例可以放在兩個(gè)地方:
1)函數(shù)或者方法下的注釋里面
2)模塊的開(kāi)頭
import doctest
doctest.testmod(verbose=True)
verbose參數(shù),設(shè)置為T(mén)rue則在執(zhí)行測(cè)試的時(shí)候會(huì)輸出詳細(xì)信息
執(zhí)行命令:python -m doctest -v xxx.py
m 參數(shù)指定運(yùn)行方式doctest
-v參數(shù)是verbose,帶上-v參數(shù)相當(dāng)于verbose=True
pytest框架運(yùn)行:
pytest -v --doctest-modules xxx.py
doctest獨(dú)立文件
doctest內(nèi)容也可以和代碼抽離開(kāi),單獨(dú)用一個(gè).txt文件保存
在當(dāng)前xxx.py同一目錄新建一個(gè)xxx.txt文件,寫(xiě)入測(cè)試的文檔,要先導(dǎo)入該功能,導(dǎo)入代碼前面也要加>>>
cmd執(zhí)行“python -m doctest -v xxx.txt”測(cè)試結(jié)果
fixture的目的是提供一個(gè)固定基線(xiàn),在該基線(xiàn)上測(cè)試可以可靠地和重復(fù)地執(zhí)行。fixture提供了區(qū)別于傳統(tǒng)單元測(cè)試(setup/teardown)有顯著改進(jìn):
(1)有獨(dú)立的命名,并通過(guò)聲明它們從測(cè)試函數(shù)、模塊、類(lèi)或整個(gè)項(xiàng)目中的使用來(lái)激活。
(2)按模塊化的方式實(shí)現(xiàn),每個(gè)fixture都可以互相調(diào)用。
(3)fixture的范圍從簡(jiǎn)單的單元擴(kuò)展到復(fù)雜的功能測(cè)試,允許根據(jù)配置和組件選項(xiàng)對(duì)fixture和測(cè)試用例進(jìn)行參數(shù)化,或者跨函數(shù) function、類(lèi)class、模塊module或整個(gè)測(cè)試會(huì)話(huà)sessio范圍。
定義fixture跟定義普通函數(shù)差不多,唯一區(qū)別就是在函數(shù)上加個(gè)裝飾器@pytest.fixture(),fixture命名不要用test_開(kāi)頭,跟用例區(qū)分開(kāi)。用例才是test_開(kāi)頭的命名。
fixture是可以有返回值的,如果沒(méi)return默認(rèn)返回None。用例調(diào)用fixture的返回值,直接就是把fixture的函數(shù)名稱(chēng)當(dāng)成變量名稱(chēng)
error和failed區(qū)別
測(cè)試結(jié)果一般有三種:passed、failed、error。(skip的用例除外)
如果在test_用例里面斷言失敗,那就是failed
如果在fixture里面斷言失敗了,那就是error (代碼錯(cuò)誤也是error)
4、使用多個(gè)fixture和fixture直接互相調(diào)用
? 如果用例需要用到多個(gè)fixture的返回?cái)?shù)據(jù),fixture也可以return一個(gè)元組、list或字典,然后從里面取出對(duì)應(yīng)數(shù)據(jù);也可以分開(kāi)定義成多個(gè)fixture,然后test_用例傳多個(gè)fixture參數(shù)。
5、fixture的作用范圍
scope參數(shù)可以控制fixture的作用范圍:session > module > class > function(默認(rèn))
unction 每一個(gè)函數(shù)或方法都會(huì)調(diào)用
class 每一個(gè)類(lèi)調(diào)用一次,一個(gè)類(lèi)可以有多個(gè)方法
module,每一個(gè).py文件調(diào)用一次,該文件內(nèi)又有多個(gè)function和class
session 是多個(gè)文件調(diào)用一次,可以跨.py文件調(diào)用,每個(gè).py文件就是module
6、pytest-html報(bào)告優(yōu)化
(nodeid中文顯示[\u6350\u52a9\u6211\u4eec]問(wèn)題解決)
字符串變量.encode("utf-8").decode("unicode_escape")
7、conftest.py作用范圍
一個(gè)測(cè)試工程下是可以有多個(gè)conftest.py的文件,一般在工程根目錄放一個(gè)conftest.py起到全局作用。
在不同的測(cè)試子目錄也可以放conftest.py,作用范圍只在該層級(jí)以及以下目錄生效。
8、運(yùn)行上次失敗用例(--lf和--ff)
命令行輸入pytest -h,找到里面兩個(gè)命令行參數(shù): --lf 和 --ff
--lf, --last-failed 只重新運(yùn)行上次運(yùn)行失敗的用例(或如果沒(méi)有失敗的話(huà)會(huì)全部跑)
--ff, --failed-first 運(yùn)行所有測(cè)試,但首先運(yùn)行上次運(yùn)行失敗的測(cè)試(這可能會(huì)重新測(cè)試,從而導(dǎo)致重復(fù)的fixture setup/teardown)
9、pytest分布式執(zhí)行(pytest-xdist)
cmd里面使用pip安裝分布式執(zhí)行插件pytest-xdist:pip install pytest-xdist
pytest-xdist插件擴(kuò)展了一些獨(dú)特的測(cè)試執(zhí)行模式pytest:
測(cè)試運(yùn)行并行化:如果有多個(gè)CPU或主機(jī),則可以將它們用于組合測(cè)試運(yùn)行。會(huì)加快運(yùn)行速度
--looponfail:在子進(jìn)程中重復(fù)運(yùn)行測(cè)試。每次運(yùn)行之后,pytest會(huì)等待,直到項(xiàng)目中的文件發(fā)生更改,然后重新運(yùn)行以前失敗的測(cè)試。
重復(fù)此過(guò)程直到所有測(cè)試通過(guò),之后再次執(zhí)行完整運(yùn)行。
多平臺(tái)覆蓋:您可以指定不同的Python解釋器或不同的平臺(tái),并在所有平臺(tái)上并行運(yùn)行測(cè)試。
在遠(yuǎn)程運(yùn)行測(cè)試之前,pytest有效地將您的程序源代碼“rsyncs”到遠(yuǎn)程位置。報(bào)告所有測(cè)試結(jié)果并顯示給您的本地終端。您可以指定不同的Python版本和解釋器。
如果您想知道pytest-xdist如何在幕后工作,可以看
https://github.com/pytest-dev/pytest-xdist/blob/master/OVERVIEW.md
并行測(cè)試
多cpu并行執(zhí)行用例,直接加個(gè)-n參數(shù)即可,后面num參數(shù)就是并行數(shù)量,比如num設(shè)置為3:pytest -n 3
用pytest-xdist插件生成html報(bào)告:pytest -n 3 --html=report.html --self-contained-html
10、重復(fù)執(zhí)行用例(pytest-repeat)
使用pip安裝pytest-repeat:pip install pytest-repeat
使用--count命令行選項(xiàng)指定要運(yùn)行測(cè)試用例和測(cè)試次數(shù):py.test --count=10 test_file.py
--repeat-scope
--repeat-scope類(lèi)似于pytest fixture的scope參數(shù),--repeat-scope也可以設(shè)置參數(shù):?session?,?module,class或者function(默認(rèn)值)
function(默認(rèn))范圍針對(duì)每個(gè)用例重復(fù)執(zhí)行,再執(zhí)行下一個(gè)用例
class?以class為用例集合單位,重復(fù)執(zhí)行class里面的用例,再執(zhí)行下一個(gè)
module?以模塊為單位,重復(fù)執(zhí)行模塊里面的用例,再執(zhí)行下一個(gè)
session?重復(fù)整個(gè)測(cè)試會(huì)話(huà),即所有收集的測(cè)試執(zhí)行一次,然后所有這些測(cè)試再次執(zhí)行等等
使用--repeat-scope=session重復(fù)執(zhí)行整個(gè)會(huì)話(huà)用例
pytest baidu/test_1_baidu.py -s --count=5 --repeat-scope=session
@pytest.mark.repeat(count)
如果要在代碼中標(biāo)記要重復(fù)多次的測(cè)試,可以使用@pytest.mark.repeat(count)裝飾器
強(qiáng)制測(cè)試運(yùn)行器在第一次失敗時(shí)停止:py.test --count=1000 -x test_file.py
pytest-repeat無(wú)法使用unittest.TestCase測(cè)試類(lèi)