1.前言
pytest配置文件可以改變pytest的運行方式,它是一個固定的文件pytest.ini文件,讀取配置信息,按指定的方式去運行。
2.ini配置文件
pytest里面有些文件是非test文件
- pytest.ini pytest的主配置文件,可以改變pytest的默認行為
- conftest.py 測試用例的一些fixture配置
- init.py 識別該文件夾為python的package包
- tox.ini 與pytest.ini類似,用tox工具時候才有用
- 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報告所有測試用例被跳過、預計失敗、預計失敗但實際被通過的原因
3.mark標記
如下案例,使用了2個標簽:webtest和hello,使用mark標記功能對于以后分類測試非常有用處
# content of test_mark.py
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
4.禁用xpass
設置xfail_strict = true可以讓那些標記為@pytest.mark.xfail但實際通過的測試用例被報告為失敗
什么叫標記為@pytest.mark.xfail但實際通過,這個比較繞腦,看以下案例
# content of test_xpass.py
import pytest
def test_hello():
print("hello world!")
assert 1
@pytest.mark.xfail()
def test_yoyo1():
a = "hello"
b = "hello world"
assert a == b
@pytest.mark.xfail()
def test_yoyo2():
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_yoyo1 xfail [ 66%]
test_xpass.py::test_yoyo2 XPASS [100%]
=============== 1 passed, 1 xfailed, 1 xpassed in 0.27 seconds ================
test_yoyo1和test_yoyo2這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_yoyo1 xfail [ 66%]
test_xpass.py::test_yoyo2 FAILED [100%]
================================== FAILURES ===================================
_________________________________ test_yoyo2 __________________________________
[XPASS(strict)]
================ 1 failed, 1 passed, 1 xfailed in 0.05 seconds ================