全網(wǎng)非常詳細(xì)的pytest配置文件
說(shuō)到配置,大家可能想到的是不經(jīng)常更改的內(nèi)容,比如Django里的settings.py文件,或者我們做自動(dòng)化的時(shí)候,把測(cè)試環(huán)境的域名和正式環(huán)境的域名放到一個(gè)配置文件里,所有的接口都從這個(gè)文件里讀取。這樣,如果有一天,我們的域名變了,我們只需要更改配置里的域名就可以了。pytest里也有幾個(gè)配置文件。
- pytest.ini:pytest的主配置文件,可以改變pytest的默認(rèn)行為,有很多可配置的選項(xiàng)。
- conftest.py:是本地的插件庫(kù),其中的hook函數(shù)和fixture將作用于該文件所在的目錄以及所有子目錄。
- __init__.py:每個(gè)測(cè)試子目錄都包含該文件時(shí),那么在多個(gè)測(cè)試目錄中可以出現(xiàn)同名測(cè)試文件。
- tox.ini:它與pytest.ini類似,只不過(guò)是tox的配置文件,你可以把pytest的配置都寫(xiě)在tox.ini里,這樣就不用同時(shí)使用tox.ini和pytest.ini兩個(gè)文件
更改默認(rèn)命令行選項(xiàng)
我們之前已經(jīng)用過(guò)pytest命令行選項(xiàng)了,比如-v/--verbose可以輸出詳細(xì)信息,-l/--showlocals可以查看失敗測(cè)試用例里堆棧中的局部變量。你也許經(jīng)常要用到某些參數(shù),又不想重復(fù)輸入,這時(shí)可以使用pytest.ini文件里的addopts設(shè)置。
[pytest] addopts = -rsxX -l --tb=short --strict
--rsxX表示pytest報(bào)告所有測(cè)試用例被跳過(guò)、預(yù)計(jì)失敗、預(yù)計(jì)失敗但實(shí)際通過(guò)的原因。-l表示pytest報(bào)告所有失敗測(cè)試的堆棧中的局部變量。--tb=short表示簡(jiǎn)化堆?;厮菪畔?,只保留文件和行數(shù)。--strict選項(xiàng)表示禁止使用未在配置文件中注冊(cè)的標(biāo)記。
我們有個(gè)test_two.py文件,里面有如下代碼
def inc(x): return x + 1 def test_answer(): assert inc(3) == 55 def test_answer1(): assert inc(4) == 5
我們沒(méi)有添加如上命令執(zhí)行一遍
再去pytest.int里添加上上面的代碼,在去執(zhí)行一遍
注冊(cè)標(biāo)記來(lái)防止拼寫(xiě)錯(cuò)誤
在前面我們學(xué)過(guò),自定義標(biāo)記可以簡(jiǎn)化測(cè)試工作,讓我們用指定的標(biāo)記運(yùn)行某個(gè)測(cè)試子集。但是,標(biāo)記很容易拼錯(cuò),比如把@pytest.mark.smoke拼成@pytest.mark.somke,默認(rèn)情況下。這不會(huì)引起程序錯(cuò)誤。pytest會(huì)以為這是你創(chuàng)建的另一個(gè)標(biāo)記。為了避免拼寫(xiě)錯(cuò)誤??梢栽趐ytest.ini文件里注冊(cè)標(biāo)記
[pytest] markers = smoke: Run the smoke test functions for tasks project get: Run the test functions that test tasks.get()
修改test.two.py
import pytest def inc(x): return x + 1 @pytest.mark.smoke def test_answer(): assert inc(3) == 55 @pytest.mark.post def test_answer1(): assert inc(4) == 5
標(biāo)記注冊(cè)好后,可以通過(guò)pytest --markers來(lái)查看
沒(méi)有注冊(cè)的標(biāo)記不會(huì)出現(xiàn)在--markers列表里。如果使用了--strict選項(xiàng),遇到拼寫(xiě)錯(cuò)誤的標(biāo)記或未注冊(cè)的標(biāo)記就會(huì)報(bào)錯(cuò)。
pytest.ini里寫(xiě)如下代碼
[pytest] markers = smoke: Run the smoke test functions for tasks project get: Run the test functions that test tasks.get()
上面的代碼我們?cè)趫?zhí)行的時(shí)候,把smoke故意寫(xiě)錯(cuò)了,也沒(méi)有報(bào)錯(cuò),只是給我們一個(gè)警告,只需要我們?cè)趇ni里注冊(cè)下就不會(huì)有警告了
在去修改pytest.ini里的代碼
[pytest] addopts = -rsxX -l --tb=short --strict markers = smoke: Run the smoke test functions for tasks project get: Run the test functions that test tasks.get()
我們?cè)趇ni里加上了addopts = -rsxX -l --tb=short --strict 這句代碼之后,如果我們拼錯(cuò)了就會(huì)報(bào)錯(cuò)
指定pytest的最低版本號(hào)
有些功能是隨著pytest版本的更新而加入到里面的,如果我們不想用比較低的版本,可以在配置里指定最低的版本號(hào)。
minversion選項(xiàng)可以指定運(yùn)行測(cè)試用例的pytest的最低版本。
[pytest] minversion = 4.0
如果使用了老版本的pytest運(yùn)行該測(cè)試,就會(huì)得到一個(gè)錯(cuò)誤信息。
指定pytest忽略某些目錄
pytest執(zhí)行測(cè)試搜索時(shí),會(huì)遞歸遍歷所有子目錄,包括某些你明知道沒(méi)必要遍歷的目錄。遇到這種情況,你可以使用norecurse選項(xiàng)簡(jiǎn)化pytest的搜索工作。
norecurse的默認(rèn)設(shè)置是 .* build dist CVS -darcs {arch}和 *.egg。因?yàn)橛?.*,所以將虛擬環(huán)境命名為.venv是一個(gè)好注意,所有以.(點(diǎn))開(kāi)頭的目錄都不會(huì)被訪問(wèn)。如果不是以.(點(diǎn))開(kāi)頭,那么需要把它加入norecursedirs里。比如我想忽略test_001目錄
[pytest] norecursedirs = .* venv test_001 *.egg dist build
先來(lái)看下目錄結(jié)構(gòu)
test_one.py
import pytest def test_case_01(): assert 0 == 0 def test_case_02(): assert 0 == 0 test_one.py
test_first
import pytest def inc(x): return x + 1 @pytest.mark.smoke def test_answer(): assert inc(3) == 55 @pytest.mark.post def test_answer1(): assert inc(4) == 5 test_first
如果我們不指定norecursedirs就會(huì)執(zhí)行djangotest目錄下的所有文件
指定norecursedirs
[pytest] norecursedirs = .* venv test_001 *.egg dist build addopts = -rsxX -l --tb=short --strict markers = smoke: Run the smoke test functions for tasks project get: Run the test functions that test tasks.get() smoek: run post: Run post
也可以指定多個(gè)目錄
[pytest] norecursedirs = .* venv test_001 test_002 *.egg dist build
指定測(cè)試目錄
norecuredirs告訴pytest哪些路徑不用訪問(wèn),而testpaths則指示pytest去哪里訪問(wèn)。testpaths是一系列相對(duì)于根目錄的路徑,用于限定測(cè)試用例的搜索范圍。只有在pytest未指定文件目錄參數(shù)或測(cè)試用例標(biāo)識(shí)符時(shí),該選項(xiàng)才有作用
如果我們只想執(zhí)行test_001下的測(cè)試用例,則可以把test_001放到testpaths里
[pytest] testpaths = test_001
那如果我既指定了testpaths和norecursedirs ,而且兩個(gè)是一樣的,結(jié)果會(huì)怎樣
[pytest] testpaths = test_001 norecursedirs = .* venv test_001 *.egg dist build
從運(yùn)行結(jié)果可以看出,如果兩個(gè)都指定,且沖突的話,是按照指定的testpaths執(zhí)行的,是不是因?yàn)閠estpaths在上面的原因?qū)е碌??我們換一下順序
[pytest] norecursedirs = .* venv test_001 *.egg dist build testpaths = test_001
從上面兩次的運(yùn)行結(jié)果可以看出,如果既指定了testpaths和norecursedirs ,而且兩個(gè)是一樣的,則是按照testpaths執(zhí)行的
更改測(cè)試搜索的規(guī)則
pytest根據(jù)一定的規(guī)則搜索并運(yùn)行測(cè)試,標(biāo)準(zhǔn)的測(cè)試搜索規(guī)則如下。
- 從一個(gè)或多個(gè)目錄開(kāi)始查找。你可以在命令行指定文件名或目錄名。如果未指定,則使用當(dāng)前目錄
- 在該目錄和所有子目錄下遞歸查找測(cè)試模塊
- 測(cè)試模塊是指文件名為test_*.py或*_test.py的文件
- 在測(cè)試模塊中查找以test_開(kāi)頭的函數(shù)名。
- 查找名字以Test開(kāi)頭的類,其中,首先篩選掉包含__init__函數(shù)的類,在查找類中以Test_開(kāi)頭的類方法
以上是標(biāo)準(zhǔn)的測(cè)試搜索規(guī)則,你也可以更改它們
python_classes
通常pytest的測(cè)試搜索規(guī)則是尋找以Test*開(kāi)頭的測(cè)試類,而且這個(gè)類不能有__init__()函數(shù)。但是,如果把測(cè)試類命名為<something>Test或<something>Suite怎么辦?python_classes就可以解決這個(gè)問(wèn)題。
[pytest] python_classes = *Test Test* *Suite
這個(gè)設(shè)置允許我們像下面這樣給類取名
class DeleteSuite(): def test_delete_1(self): pass def test_delete_2(self): pass
我們修改test_001目錄下的test_onne.py文件
class DeleteSuite(): def test_delete_1(self): assert True def test_delete_2(self): assert False
先不添加python_classes執(zhí)行一下
然后我們添加上python_classes執(zhí)行一下
[pytest] python_classes = *Test Test* *Suite
python_files
像pytest_classes一樣,python_files可以更改默認(rèn)的測(cè)試搜索規(guī)則,而不是僅查找以test_*開(kāi)頭的文件和以*_test結(jié)尾的文件
假設(shè)你的測(cè)試文件統(tǒng)一命名為check_<something>.py。你不必重命名所有的測(cè)試文件,只要在pytest.ini文件里增加一行配置即可
[pytest] python_files = test_* *_test check_*
我們將test_one.py改為check_one.py在執(zhí)行
[pytest] python_files = test_* *_test check_* python_classes = *Test Test* *Suite
python_functions
python_functions與之前的兩個(gè)設(shè)置類似,它只是用來(lái)測(cè)試函數(shù)和方法的命名。more規(guī)則以test_*開(kāi)頭。如果想添加check_*,則只需要添加一行配置
[pytest] python_functions = test_* check_*
修改test_one.py下的代碼
class DeleteSuite(): def check_delete_1(self): assert True def check_delete_2(self): assert False
[pytest] python_functions = test_* check_* python_files = test_* *_test check_* python_classes = *Test Test* *Suite addopts = -rsxX -l -v --tb=short --strict
禁用XPATH
設(shè)置xfail_strict = true將會(huì)使那些被標(biāo)記為@pytest.mark.xfail但實(shí)際通過(guò)的測(cè)試用例也被報(bào)告為失敗
[pytest] xfail_strict = true
很難理解是吧?。?!喝杯茶,我給你給個(gè)栗子吃
test_one.py代碼如下,可以看到,我們有兩個(gè)測(cè)試用例,都是標(biāo)記的預(yù)期失敗,但其中一個(gè)是會(huì)成功,一個(gè)是失敗的,我們不加xfail_strict = true來(lái)執(zhí)行一下
import pytest @pytest.mark.xfail() def test_answer(): assert 5 == 5 @pytest.mark.xfail() def test_answer1(): assert 5 != 5
可以看到有一個(gè)通過(guò)了,有一個(gè)失敗了,但是我們?nèi)绻氚褬?biāo)記為預(yù)期失敗的,不管結(jié)果是成功還是失敗都標(biāo)記為失敗,則要在配置里加xfail_strict = true
[pytest] xfail_strict = true
這樣兩個(gè)用例就都是失敗的
到此這篇關(guān)于全網(wǎng)非常詳細(xì)的pytest配置文件的文章就介紹到這了,更多相關(guān)pytest配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python+OpenCV圖像處理——圖像二值化的實(shí)現(xiàn)
這篇文章主要介紹了Python+OpenCV實(shí)現(xiàn)圖像二值化,幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下2020-10-10Django Auth應(yīng)用實(shí)現(xiàn)用戶身份認(rèn)證
Django Auth 應(yīng)用一般用在用戶的登錄注冊(cè)上,用于判斷當(dāng)前的用戶是否合法。本文將介紹Auth的另一個(gè)功能,即認(rèn)證用戶身份,感興趣的同學(xué)可以關(guān)注一下2021-12-12python 實(shí)現(xiàn)IP子網(wǎng)計(jì)算
這篇文章主要介紹了python 實(shí)現(xiàn)IP子網(wǎng)計(jì)算的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-02-02Python?GUI布局工具Tkinter入門(mén)之旅
這篇文章主要為大家介紹了Python?GUI布局工具Tkinter的基礎(chǔ),Tkinter?作為?Python?的標(biāo)準(zhǔn)庫(kù),是非常流行的?Python?GUI?工具,同時(shí)也是非常容易學(xué)習(xí)的,今天我們就來(lái)開(kāi)啟?Tkinter的入門(mén)之旅2022-08-08使用 python 實(shí)現(xiàn)單人AI 掃雷游戲
這篇文章主要介紹了使用 python 實(shí)現(xiàn)單人AI 掃雷游戲,今天我們用 Python 完成這個(gè)小程序,并且用AI來(lái)學(xué)習(xí)并實(shí)現(xiàn)它,需要的朋友可以參考下2021-08-08在python中用print()輸出多個(gè)格式化參數(shù)的方法
今天小編就為大家分享一篇在python中用print()輸出多個(gè)格式化參數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07