配置文件一般位于项目的根目录。pytest支持的配置文件如下(按照优先级顺序排列):
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:控制台输出样式
filterwarnings:警告过滤器
设置对匹配的警告应采取的过滤器和操作列表。默认情况下,测试会话期间发出的所有警告都将在测试会话结束时显示在摘要中。
minversion :指定运行测试所需的最小pytest版本。
主配置文件,优先级最高,一般位于项目跟目录中,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 文件内容如下:
- # content of test_sample.py
- def test_one():
- pass
testmodule/test_module.py 文件内容如下:
- # content of test_module.py
-
- class TestClass:
- def test_two(self):
- pass
-
- def test_three(self):
- pass
testmodule/testmodule1/test_module1.py 文件内容如下:
- # content of test_module1.py
- def test_four():
- pass
pytest.ini 主配置文件内容如下:
- [pytest]
- 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文件。
本地的插件库,一般放在测试用例同级目录下,用来存放Fixture夹具函数和使用钩子函数(hook)编写的本地插件。
特点:
- from datetime import datetime
- from py.xml import html
- import pytest
-
-
- @pytest.fixture(scope=function)
- def fixture_function():
- print("夹具的作用域scope = function")
- return 1
-
-
- # #
- # def pytest_collection_modifyitems(session, config,items):
- # """
- # called after collection is completed.
- # you can modify the ``items`` list
- # :param _pytest.main.Session session: the pytest session object
- # :param _pytest.config.Config config: pytest config object
- # :param List[_pytest.nodes.Item] items: list of item objects
- #
- # """
- # print("收集到的测试用例:%s"%items)
- # print("收集到的测试用例items:",type(items))
- # items.sort(key=lambda x: x.name)
- # print('调整后的测试用例执行顺序',items)
- # #
-
-
- #
- # 编辑报告标题
- def pytest_html_report_title(report):
- report.title = "My very own title!"
-
-
- # 运行测试前修改环境信息
- def pytest_configure(config):
- config._metadata["foo"] = "bar"
-
-
- # 运行测试后修改环境信息
- @pytest.hookimpl(tryfirst=True)
- def pytest_sessionfinish(session, exitstatus):
- session.config._metadata["foo"] = "bar"
-
-
- # 编辑摘要信息
- def pytest_html_results_summary(prefix, summary, postfix):
- prefix.extend([html.p("foo: bar")])
-
-
- # 测试结果表格
- def pytest_html_results_table_header(cells):
- cells.insert(1, html.th("Time", class_="sortable time", col="time"))
- cells.pop()
-
-
- def pytest_html_results_table_row(report, cells):
- cells.insert(1, html.td(datetime.utcnow(), class_="col-time"))
- cells.pop()
- #
reference: