網站首頁 編程語言 正文
說到配置,大家可能想到的是不經常更改的內容,比如Django里的settings.py文件,或者我們做自動化的時候,把測試環境的域名和正式環境的域名放到一個配置文件里,所有的接口都從這個文件里讀取。這樣,如果有一天,我們的域名變了,我們只需要更改配置里的域名就可以了。pytest里也有幾個配置文件。
- pytest.ini:pytest的主配置文件,可以改變pytest的默認行為,有很多可配置的選項。
- conftest.py:是本地的插件庫,其中的hook函數和fixture將作用于該文件所在的目錄以及所有子目錄。
- __init__.py:每個測試子目錄都包含該文件時,那么在多個測試目錄中可以出現同名測試文件。
- tox.ini:它與pytest.ini類似,只不過是tox的配置文件,你可以把pytest的配置都寫在tox.ini里,這樣就不用同時使用tox.ini和pytest.ini兩個文件
更改默認命令行選項
我們之前已經用過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的最低版本號
有些功能是隨著pytest版本的更新而加入到里面的,如果我們不想用比較低的版本,可以在配置里指定最低的版本號。
minversion選項可以指定運行測試用例的pytest的最低版本。
[pytest]
minversion = 4.0
如果使用了老版本的pytest運行該測試,就會得到一個錯誤信息。
指定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根據一定的規則搜索并運行測試,標準的測試搜索規則如下。
- 從一個或多個目錄開始查找。你可以在命令行指定文件名或目錄名。如果未指定,則使用當前目錄
- 在該目錄和所有子目錄下遞歸查找測試模塊
- 測試模塊是指文件名為test_*.py或*_test.py的文件
- 在測試模塊中查找以test_開頭的函數名。
- 查找名字以Test開頭的類,其中,首先篩選掉包含__init__函數的類,在查找類中以Test_開頭的類方法
以上是標準的測試搜索規則,你也可以更改它們
python_classes
通常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
python_files
像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
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
禁用XPATH
設置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
這樣兩個用例就都是失敗的
原文鏈接:https://www.cnblogs.com/zouzou-busy/p/11323606.html
相關推薦
- 2022-04-09 Android項目中gradle的執行流程_Android
- 2022-12-09 C#中async和await的深入分析_C#教程
- 2022-06-09 4種方法python批量修改替換列表中元素_python
- 2023-07-05 【nacos優化】定時刪除access日志
- 2022-09-29 基于Python3編寫一個GUI翻譯器_python
- 2022-05-10 C++構造函數+復制構造函數+重載等號運算符調用_C 語言
- 2022-05-21 Python中三種花式打印的示例詳解_python
- 2022-01-19 webpack5 配置熱更新失效問題
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支