一、前言
pytest配置文件可以改變pytest的運行方式,它是一個固定的文件pytest.ini文件,讀取配置信息,按指定的方式去執行。
二、ini配置文件
pytest里面有些文件是非test文件
(1)pytest.ini pytest的主配置文件,可以改變pytest的默認行為
(2)conftest.py測試用例的一些fixture配置
(3)init.py識別該文件夾為python的package包
(4)tox.ini與pytest.ini類似,用tox工具時候才有用
(5)setup.cfg也是ini格式文件,影響setup.py的行為
ini文件基本格式
# 保存為pytest.ini文件 [pytest] addopts = -rsxX xfail_strict = true
使用pytest --help指令可以查看pytest.ini的設置選項
[pytest] ini-options in the first pytest.ini|tox.ini|setup.cfg file found: markers (linelist) markers for test functions empty_parameter_set_mark (string) default marker for empty parametersets norecursedirs (args) directory patterns to avoid for recursion testpaths (args) directories to search for tests when no files or dire console_output_style (string) console output: classic or with additional progr usefixtures (args) list of default fixtures to be used with this project python_files (args) glob-style file patterns for Python test module disco python_classes (args) prefixes or glob names for Python test class discover python_functions (args) prefixes or glob names for Python test function and m xfail_strict (bool) default for the strict parameter of addopts (args) extra command line options minversion (string) minimally required pytest version
--rsxX表示pytest報告所有測試用例被跳過、預計失敗、預計失敗但實際被通過的原因
三、mark標記
如下案例,使用了2個標簽:webtest和hello,使用mark標記功能對於以后分類測試非常有用處
import pytest @pytest.mark.webtest def test_send_http(): print("mark web test") def test_something_quick(): pass def test_another(): pass @pytest.mark.hello class TestClass: def test_01(self): print("hello:") def test_02(self): print("hello world!") if __name__=="__main__": pytest.main(["-v","test_mark.py","-m=hello"])
運行結果:
============================= test session starts ============================= platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0 -- D:\soft\python3.6\python.exe cachedir: .pytest_cache metadata: {'Python': '3.6.0', 'Platform': 'Windows-7-6.1.7601-SP1', 'Packages': {'pytest': '3.6.3', 'py': '1.5.4', 'pluggy': '0.6.0'}, 'Plugins': {'metadata': '1.7.0', 'html': '1.19.0', 'allure-adaptor': '1.7.10'}, 'JAVA_HOME': 'D:\\soft\\jdk18\\jdk18v'} rootdir: D:\YOYO, inifile: plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10 collecting ... collected 5 items / 3 deselected test_mark.py::TestClass::test_01 PASSED [ 50%] test_mark.py::TestClass::test_02 PASSED [100%] =================== 2 passed, 3 deselected in 0.11 seconds ====================
有時候標簽多了,不容易記住,為了方便后續執行指令的時候能准確使用mark的標簽,可以寫入到pytest.ini文件
# pytest.ini [pytest] markers = webtest: Run the webtest case hello: Run the hello case
標記好之后,可以使用pytest --markers查看到
pytest --markers
四、禁用xpass
設置xfail_strict = true可以讓那些標記為@pytest.mark.xfail但實際通過的測試用例被報告為失敗,什么叫標記為@pytest.mark.xfail但實際通過,這個比較繞腦,看以下案例
import pytest def test_hello(): print("hello world!") assert 1 @pytest.mark.xfail() def test_01(): a = "hello" b = "hello world" assert a == b @pytest.mark.xfail() def test_02(): a = "hello" b = "hello world" assert a != b if __name__=="__main__": pytest.main(["-v","test_xpass.py"])
運行結果:
collecting ... collected 3 items test_xpass.py::test_hello PASSED [ 33%] test_xpass.py::test_01 xfail [ 66%] test_xpass.py::test_02 XPASS [100%] =============== 1 passed, 1 xfailed, 1 xpassed in 0.27 seconds ================
test_01和test_02這2個用例一個是a == b一個是a != b,兩個都標記失敗了,我們希望兩個用例不用執行全部顯示xfail。實際上最后一個卻顯示xpass。為了讓兩個都顯示xfail,那就加個配置xfail_strict = true
# pytest.ini [pytest] markers = webtest: Run the webtest case hello: Run the hello case xfail_strict = true
運行結果:
collecting ... collected 3 items test_xpass.py::test_hello PASSED [ 33%] test_xpass.py::test_01 xfail [ 66%] test_xpass.py::test_02 FAILED [100%] ================================== FAILURES =================================== _________________________________ test_yoyo2 __________________________________ [XPASS(strict)] ================ 1 failed, 1 passed, 1 xfailed in 0.05 seconds ================