当前位置: 代码迷 >> 综合 >> pytest框架学习(六) - pytest.ini
  详细解决方案

pytest框架学习(六) - pytest.ini

热度:98   发布时间:2023-12-26 14:20:24.0

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 functionsempty_parameter_set_mark (string) default marker for empty parametersetsnorecursedirs (args)     directory patterns to avoid for recursiontestpaths (args)         directories to search for tests when no files or direconsole_output_style (string) console output: classic or with additional progrusefixtures (args)       list of default fixtures to be used with this projectpython_files (args)      glob-style file patterns for Python test module discopython_classes (args)    prefixes or glob names for Python test class discoverpython_functions (args)  prefixes or glob names for Python test function and mxfail_strict (bool)      default for the strict parameter of addopts (args)           extra command line optionsminversion (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():passdef 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 deselectedtest_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 casehello: 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 pytestdef 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 != bif __name__ == "__main__":pytest.main(["-v", "test_xpass.py"])

测试结果

collecting ... collected 3 itemstest_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 casehello: Run the hello casexfail_strict = true
collecting ... collected 3 itemstest_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 ================