<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
說到設定,大家可能想到的是不經常更改的內容,比如Django裡的settings.py檔案,或者我們做自動化的時候,把測試環境的域名和正式環境的域名放到一個組態檔裡,所有的介面都從這個檔案裡讀取。這樣,如果有一天,我們的域名變了,我們只需要更改設定裡的域名就可以了。pytest裡也有幾個組態檔。
我們之前已經用過pytest命令列選項了,比如-v/--verbose可以輸出詳細資訊,-l/--showlocals可以檢視失敗測試用例裡堆疊中的區域性變數。你也許經常要用到某些引數,又不想重複輸入,這時可以使用pytest.ini檔案裡的addopts設定。
[pytest] addopts = -rsxX -l --tb=short --strict
--rsxX表示pytest報告所有測試用例被跳過、預計失敗、預計失敗但實際通過的原因。-l表示pytest報告所有失敗測試的堆疊中的區域性變數。--tb=short表示簡化堆疊回溯資訊,只保留檔案和行數。--strict選項表示禁止使用未在組態檔中註冊的標記。
我們有個test_two.py檔案,裡面有如下程式碼
def inc(x): return x + 1 def test_answer(): assert inc(3) == 55 def test_answer1(): assert inc(4) == 5
我們沒有新增如上命令執行一遍
再去pytest.int裡新增上上面的程式碼,在去執行一遍
在前面我們學過,自定義標記可以簡化測試工作,讓我們用指定的標記執行某個測試子集。但是,標記很容易拼錯,比如把@pytest.mark.smoke拼成@pytest.mark.somke,預設情況下。這不會引起程式錯誤。pytest會以為這是你建立的另一個標記。為了避免拼寫錯誤。可以在pytest.ini檔案裡註冊標記
[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
標記註冊好後,可以通過pytest --markers來檢視
沒有註冊的標記不會出現在--markers列表裡。如果使用了--strict選項,遇到拼寫錯誤的標記或未註冊的標記就會報錯。
pytest.ini裡寫如下程式碼
[pytest] markers = smoke: Run the smoke test functions for tasks project get: Run the test functions that test tasks.get()
上面的程式碼我們在執行的時候,把smoke故意寫錯了,也沒有報錯,只是給我們一個警告,只需要我們在ini裡註冊下就不會有警告了
在去修改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()
我們在ini里加上了addopts = -rsxX -l --tb=short --strict 這句程式碼之後,如果我們拼錯了就會報錯
有些功能是隨著pytest版本的更新而加入到裡面的,如果我們不想用比較低的版本,可以在設定裡指定最低的版本號。
minversion選項可以指定執行測試用例的pytest的最低版本。
[pytest] minversion = 4.0
如果使用了老版本的pytest執行該測試,就會得到一個錯誤資訊。
pytest執行測試搜尋時,會遞迴遍歷所有子目錄,包括某些你明知道沒必要遍歷的目錄。遇到這種情況,你可以使用norecurse選項簡化pytest的搜尋工作。
norecurse的預設設定是 .* build dist CVS -darcs {arch}和 *.egg。因為有 .*,所以將虛擬環境命名為.venv是一個好注意,所有以.(點)開頭的目錄都不會被存取。如果不是以.(點)開頭,那麼需要把它加入norecursedirs裡。比如我想忽略test_001目錄
[pytest] norecursedirs = .* venv test_001 *.egg dist build
先來看下目錄結構
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就會執行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
也可以指定多個目錄
[pytest] norecursedirs = .* venv test_001 test_002 *.egg dist build
norecuredirs告訴pytest哪些路徑不用存取,而testpaths則指示pytest去哪裡存取。testpaths是一系列相對於根目錄的路徑,用於限定測試用例的搜尋範圍。只有在pytest未指定檔案目錄引數或測試用例識別符號時,該選項才有作用
如果我們只想執行test_001下的測試用例,則可以把test_001放到testpaths裡
[pytest] testpaths = test_001
那如果我既指定了testpaths和norecursedirs ,而且兩個是一樣的,結果會怎樣
[pytest] testpaths = test_001 norecursedirs = .* venv test_001 *.egg dist build
從執行結果可以看出,如果兩個都指定,且衝突的話,是按照指定的testpaths執行的,是不是因為testpaths在上面的原因導致的?我們換一下順序
[pytest] norecursedirs = .* venv test_001 *.egg dist build testpaths = test_001
從上面兩次的執行結果可以看出,如果既指定了testpaths和norecursedirs ,而且兩個是一樣的,則是按照testpaths執行的
pytest根據一定的規則搜尋並執行測試,標準的測試搜尋規則如下。
以上是標準的測試搜尋規則,你也可以更改它們
通常pytest的測試搜尋規則是尋找以Test*開頭的測試類,而且這個類不能有__init__()函數。但是,如果把測試類命名為<something>Test或<something>Suite怎麼辦?python_classes就可以解決這個問題。
[pytest] python_classes = *Test Test* *Suite
這個設定允許我們像下面這樣給類取名
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執行一下
然後我們新增上python_classes執行一下
[pytest] python_classes = *Test Test* *Suite
像pytest_classes一樣,python_files可以更改預設的測試搜尋規則,而不是僅查詢以test_*開頭的檔案和以*_test結尾的檔案
假設你的測試檔案統一命名為check_<something>.py。你不必重新命名所有的測試檔案,只要在pytest.ini檔案裡增加一行設定即可
[pytest] python_files = test_* *_test check_*
我們將test_one.py改為check_one.py在執行
[pytest] python_files = test_* *_test check_* python_classes = *Test Test* *Suite
python_functions與之前的兩個設定類似,它只是用來測試函數和方法的命名。more規則以test_*開頭。如果想新增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
設定xfail_strict = true將會使那些被標記為@pytest.mark.xfail但實際通過的測試用例也被報告為失敗
[pytest] xfail_strict = true
很難理解是吧!!!喝杯茶,我給你給個栗子吃
test_one.py程式碼如下,可以看到,我們有兩個測試用例,都是標記的預期失敗,但其中一個是會成功,一個是失敗的,我們不加xfail_strict = true來執行一下
import pytest @pytest.mark.xfail() def test_answer(): assert 5 == 5 @pytest.mark.xfail() def test_answer1(): assert 5 != 5
可以看到有一個通過了,有一個失敗了,但是我們如果想把標記為預期失敗的,不管結果是成功還是失敗都標記為失敗,則要在設定里加xfail_strict = true
[pytest] xfail_strict = true
這樣兩個用例就都是失敗的
到此這篇關於全網非常詳細的pytest組態檔的文章就介紹到這了,更多相關pytest組態檔內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45