• pytest合集(9)— 配置文件


    1、配置文件

    配置文件一般位于项目的根目录。pytest支持的配置文件如下(按照优先级顺序排列):

    • pytest.ini:主配置文件,优先级最高。
    • pyproject.toml:6.0 版中的新功能,Python生态系统中软件打包的未来
    • tox.ini:tox项目的配置文件
    • setup.cfg:通用配置文件,除非非常简单的用例,否则不建议使用

    2、配置选项

    pytest -h 可以查看pytest命令行参数大全,其中 [pytest] ini-options 列出了所有内置的配置选项,这些配置选项可以写入配置文件中,格式 name=value,常见配置选项:

    addopts:命令行参数

    addopts = --strict-markers

    只允许使用已知标记,未在pytest.ini文件中注册的任何标记都将引发异常,这可用于防止用户意外输错标记名称。

    xfail_strict = true:

    @pytest.mark.xfail标记预期失败的测试用例,如果执行成功,结果将标记为FAILED,而不再是XPASS了。

    markers:标记

    usefixtures:夹具

    testpaths python_files,python_classes ,python_functions  :管理测试用例搜索范围

    testpaths = testcases

    python_files =     test_*  *_test  test*

    python_classes =   Test*   test*

    python_functions = test_*  test*

    norecursedirs:忽略目录

    需要忽略的搜索目录,pytest 收集测试用例时,会递归遍历所有子目录,包括某些你明知道没必要遍历的目录,遇到这种情况,可以使用 norecursedirs 参数简化 pytest 的搜索工作,默认忽略选项如下:

    norecursedirs = .*  *.egg  _darcs build CVS dist node_modules venv {arch}

    cache_dir: pytest缓存目录

    pytest运行测试用例的时候,默认会在当前路径下创建.pytest_cache文件夹,即pytest缓存目录。

    使用这个配置选项可以自定义pytest缓存目录,可以是相对路径和绝对路径。

    console_output_style:控制台输出样式

    • classic,经典的 pytest 输出
    • progress,类似于经典的 pytest 输出,但带有进度指示器 [ 66%]
    • count,类似于 progress ,但将进度显示为已完成的测试数量而不是百分比[2/3]

    filterwarnings:警告过滤器

    设置对匹配的警告应采取的过滤器和操作列表。默认情况下,测试会话期间发出的所有警告都将在测试会话结束时显示在摘要中。

    minversion :指定运行测试所需的最小pytest版本。

    3、pytest.ini 

    主配置文件,优先级最高,一般位于项目跟目录中,pytest运行的时候会自动识别该文件,可以设置pytest的默认行为,文件打头[pytest],后面跟着配置选项列表,格式 name=value,一个配置选项如果有多个values需要使用空格分割,也可以使用分号添加注释。

    [pytest]
    ;命令行参数
    ;--strict-markers只允许使用已知标记,未在pytest.ini文件中注册的任何标记都将引发异常。
    addopts = -v --strict-markers --html=.report/report.html
    
    ;@pytest.mark.xfail标记预期失败的测试用例,如果执行成功,结果将标记为FAILED,而不再是XPASS了。
    xfail_strict = true
    
    ;注册自定义标记
    markers =
        slow: marks tests as slow (deselect with '-m "not slow"')
        foo:custom mark1
    
    ;测试用例搜索范围
    testpaths = testcases testmark
    
    ;设置控制台输出样式:
    console_output_style = progress
    
    ;指定运行测试所需的最小pytest版本。
    minversion = 6.2.3
    

    思考:pytest运行的时候是怎么读取pytest.ini配置文件?

    新建pytest-test项目,目录如下:

    testcases/test_sample.py 文件内容如下:

    1. # content of test_sample.py
    2. def test_one():
    3. pass

     testmodule/test_module.py 文件内容如下:

    1. # content of test_module.py
    2. class TestClass:
    3. def test_two(self):
    4. pass
    5. def test_three(self):
    6. pass

    testmodule/testmodule1/test_module1.py 文件内容如下:

    1. # content of test_module1.py
    2. def test_four():
    3. pass

    pytest.ini 主配置文件内容如下:

    1. [pytest]
    2. addopts = -v --html=./report/report.html

    (1)在项目根目录下运行pytest结果如下:

     控制台输出了测试的详细信息和生成了测试日报,跟pytest.ini文件中的命令行参数一致, 可知,项目根目录下的pytest.ini文件作用于项目下所有的测试用例。

    (2)切换到testmodule路径下执行pytest:

    可知,pytest只收集了testmodle模块下的所有测试用例,但是读取了项目跟目录下pytest.ini文件,生成了测试报告。

    (3)切换到testmodule1路径下执行pytest:

    可知,pytest只收集了testmodle1模块下的所有测试用例,但是读取了项目跟目录下pytest.ini文件,生成了测试报告。

    (4)将pytest.ini文件移动到testcases目录下,仍在testmodule1路径下执行pytest:

    可知,pytest运行的时候并没有读取到testcases目录下的pytest.ini文件。

    总结:pytest运行的时候会去读取当前路径及其父路径,直到项目跟目录下的pytest.ini文件。

    4、conftest.py 

    本地的插件库,一般放在测试用例同级目录下,用来存放Fixture夹具函数和使用钩子函数(hook)编写的本地插件。

    特点:

    • conftest.py文件名是固定的,不能修改
    • contest.py文件不需要导入,pytest运行的时候会自动识别该文件
    • conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件
    • conftest.py作用于文件同级目录和子目录下的所有测试用例,当有多个conftest.py文件的时候,子目录的conftest.py文件优先级较高
    • 定义夹具@pytest.fixture的作用域参数scope结合使用:session,module,class,function
    1. from datetime import datetime
    2. from py.xml import html
    3. import pytest
    4. @pytest.fixture(scope=function)
    5. def fixture_function():
    6. print("夹具的作用域scope = function")
    7. return 1
    8. # #
    9. # def pytest_collection_modifyitems(session, config,items):
    10. # """
    11. # called after collection is completed.
    12. # you can modify the ``items`` list
    13. # :param _pytest.main.Session session: the pytest session object
    14. # :param _pytest.config.Config config: pytest config object
    15. # :param List[_pytest.nodes.Item] items: list of item objects
    16. #
    17. # """
    18. # print("收集到的测试用例:%s"%items)
    19. # print("收集到的测试用例items:",type(items))
    20. # items.sort(key=lambda x: x.name)
    21. # print('调整后的测试用例执行顺序',items)
    22. # #
    23. #
    24. # 编辑报告标题
    25. def pytest_html_report_title(report):
    26. report.title = "My very own title!"
    27. # 运行测试前修改环境信息
    28. def pytest_configure(config):
    29. config._metadata["foo"] = "bar"
    30. # 运行测试后修改环境信息
    31. @pytest.hookimpl(tryfirst=True)
    32. def pytest_sessionfinish(session, exitstatus):
    33. session.config._metadata["foo"] = "bar"
    34. # 编辑摘要信息
    35. def pytest_html_results_summary(prefix, summary, postfix):
    36. prefix.extend([html.p("foo: bar")])
    37. # 测试结果表格
    38. def pytest_html_results_table_header(cells):
    39. cells.insert(1, html.th("Time", class_="sortable time", col="time"))
    40. cells.pop()
    41. def pytest_html_results_table_row(report, cells):
    42. cells.insert(1, html.td(datetime.utcnow(), class_="col-time"))
    43. cells.pop()
    44. #


    reference:

    Configuration — pytest documentation

    API Reference — pytest documentation

  • 相关阅读:
    【动态规划】爬楼梯爬的不仅仅是楼梯
    Linux CentOS7 lrzsz工具
    点云预处理(点云滤波)学习记录
    NodeMCU ESP8266 外设的 Arduino API 接口介绍
    如何免费创建三级域名?
    FastAdmin开发七牛云上传插件
    阶段七-Day02-Spring02
    wireshark初步认识
    Keras深度学习实战(17)——使用U-Net架构进行图像分割
    Django报错:RuntimeError at /home/ 解决办法
  • 原文地址:https://blog.csdn.net/panc_guizaijianchi/article/details/126301303