pytest简易教程(11):pytest的配置文件(pytest.ini)
pytest简易教程汇总,详见:https://www.cnblogs.com/uncleyong/p/17982846
简介
pytest.ini是pytest的主配置文件,可以添加配置改变pytest的默认行为,这样不用我们每次执行都在命令行中指定很多参数;
此配置文件通常放到项目根目录下。
配置项
执行pytest -h,查看可用于pytest.ini的配置
[pytest] ini-options in the first pytest.ini|tox.ini|setup.cfg|pyproject.toml 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 directories are given on the command line
filterwarnings (linelist):
Each line specifies a pattern for warnings.filterwarnings. Processed after
-W/--pythonwarnings.
usefixtures (args): List of default fixtures to be used with this project
python_files (args): Glob-style file patterns for Python test module discovery
python_classes (args):
Prefixes or glob names for Python test class discovery
python_functions (args):
Prefixes or glob names for Python test function and method discovery
disable_test_id_escaping_and_forfeit_all_rights_to_community_support (bool):
Disable string escape non-ASCII characters, might cause unwanted side effects(use at your
own risk)
console_output_style (string):
Console output: "classic", or with additional progress information ("progress"
(percentage) | "count" | "progress-even-when-capture-no" (forces progress even when
capture=no)
xfail_strict (bool): Default for the strict parameter of xfail markers when not given explicitly (default:
False)
tmp_path_retention_count (string):
How many sessions should we keep the `tmp_path` directories, according to
`tmp_path_retention_policy`.
tmp_path_retention_policy (string):
Controls which directories created by the `tmp_path` fixture are kept around, based on
test outcome. (all/failed/none)
enable_assertion_pass_hook (bool):
Enables the pytest_assertion_pass hook. Make sure to delete any previously generated pyc
cache files.
junit_suite_name (string):
Test suite name for JUnit report
junit_logging (string):
Write captured log messages to JUnit report: one of
no|log|system-out|system-err|out-err|all
junit_log_passing_tests (bool):
Capture log information for passing tests to JUnit report:
junit_duration_report (string):
Duration time to report: one of total|call
junit_family (string):
Emit XML for schema: one of legacy|xunit1|xunit2
doctest_optionflags (args):
Option flags for doctests
doctest_encoding (string):
Encoding used for doctest files
cache_dir (string): Cache directory path
log_level (string): Default value for --log-level
log_format (string): Default value for --log-format
log_date_format (string):
Default value for --log-date-format
log_cli (bool): Enable log display during test run (also known as "live logging")
log_cli_level (string):
Default value for --log-cli-level
log_cli_format (string):
Default value for --log-cli-format
log_cli_date_format (string):
Default value for --log-cli-date-format
log_file (string): Default value for --log-file
log_file_level (string):
Default value for --log-file-level
log_file_format (string):
Default value for --log-file-format
log_file_date_format (string):
Default value for --log-file-date-format
log_auto_indent (string):
Default value for --log-auto-indent
pythonpath (paths): Add paths to sys.path
faulthandler_timeout (string):
Dump the traceback of all threads if a test takes more than TIMEOUT seconds to finish
addopts (args): Extra command line options
minversion (string): Minimally required pytest version
required_plugins (args):
Plugins that must be present for pytest to run
render_collapsed (string):
row(s) to render collapsed on open.
max_asset_filename_length (string):
set the maximum filename length for assets attached to the html report.
environment_table_redact_list (linelist):
a list of regexes corresponding to environment table variables whose values should be
redacted from the report
initial_sort (string):
column to initially sort on.
generate_report_on_test (bool):
the HTML report will be generated after each test instead of at the end of the run.
reruns (string): number of times to re-run failed tests. defaults to 0.
reruns_delay (string):
add time (seconds) delay between reruns.
配置文件样例
pytest.ini
[pytest] # 命令行执行参数 addopts = -vs --strict-markers # 排除目录 norecursedirs = xxx # 默认执行目录 testpaths = case # 执行规则:class python_classes = Test* # 执行规则:py文件 python_files = test_* *_test # 执行规则:function python_functions = test_* # 自定义注册标记 markers = user: 用户模块 order: 订单模块
addopts:命令行参数
pytest命令行运行参数可以写入到pytest.ini中的addopts参数值中,addopts参数几乎支持所有参数,这样避免每一次运行的时候都需要输入参数;
多个参数用空格分隔。
说明:
[pytest] addopts = -vs --strict-markers 等价于命令行参数: pytest -vs --strict-markers 等价于main: if __name__ == "__main__": pytest.main(["-vs","--strict-markers"])
目录规则
norecursedirs = sub_case testpaths = case
规则
-
1. norecursedirs:配置测试不搜索路径(也就是不访问哪些目录)
-
2. testpaths:配置测试搜索路径(也就是要访问的目录)
-
3. 当两者有冲突时,比如二者配置的一样,testpaths优先,也就是执行testpaths下的所有用例
-
4. testpaths包含norecursedirs,执行testpaths下除了norecursedirs的用例
-
5. norecursedirs包含testpaths,不执行任何用例,并给出警告
- 6.testpaths可以配置多个路径,用空格分隔
验证

pytest.ini配置文件内容:
[pytest] # 命令行执行参数 addopts = -vs --strict-markers # 排除目录 ; norecursedirs = case norecursedirs = sub_case # 默认执行目录 testpaths = case ; testpaths = sub_case # 执行规则:class python_classes = Test* # 执行规则:py文件 python_files = test_* *_test # 执行规则:function python_functions = test_*
test_qzcsbj.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
class Test01:
def test_case2(self):
print("--------------test_case2")
def test_case1(self):
print("--------------test_case1")
test_qzcsbj1.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
class TestCase:
def test_a(self):
print("---test_a")
def test_b(self):
print("---test_b")
test_qzcsbj2.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
def test_c():
print("---test_c")
assert 1 == 1
如果配置
norecursedirs = sub_case testpaths = case
结果是:执行case下除了sub_case的用例

如果配置(实际不会这么配置,这里只是为了测试)
norecursedirs = case testpaths = case
结果是:执行case下所有用例

如果配置
norecursedirs = case testpaths = sub_case
结果是:不执行任何用例

补充1:关于搜索
如果仅配置testpaths
testpaths = ./case
在项目根目录执行,结果是执行了5条

在case目录执行,结果是执行了5条

在sub_case目录执行,结果是执行了3条

结论:从命令执行的目录开始搜索在testpaths下的用例
补充2:关于搜索
如果仅配置testpaths
testpaths = ./case/sub_case
结果执行了3条用例

结果执行了5条用例,说明也执行当前目录下py文件中用例,因为py文件在testpaths路径的case下(如果py文件在项目根目录,pytest也在根目录下执行,不会执行根目录下这个py文件中用例,因为此文件不在testpaths路径的任何一级)。建议:不同用例放同级下不同的目录即可。

结果执行了3条用例

和sub_test同级,创建sub_test2,下面创建test_qzcsbj3.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog : https://www.cnblogs.com/uncleyong/
def test_d():
print("---test_d")
assert 1 == 1
结果:虽然testpaths只配置了sub_case目录,在sub_case2下执行,依然会执行此目录下用例,因为sub_case2在配置中./case/sub_case的case下

执行规则
python_classes = Test* python_files = test_*.py *_test.py python_functions = test_* qzcsbj_*
说明:
python_files = test_*.py,表示配置测试搜索的文件名
python_classes = Test*,表示配置测试搜索的类名
python_functions = test_*,表示配置测试搜索的函数名
我们可以修改规则,比如function除了test_开头,还可以qzcsbj_开头,不过,不建议修改。
另外,如果不加通配符,表示执行指定内容,比如python_files = test_qzcsbj.py,表示执行test_qzcsbj.py文件。
xfail:标志规则
设置xfail_strict = true,标记为@pytest.mark.xfail且实际是通过(显示XPASS)的测试用例会被报告为失败FAILED
xfail_strict默认是false,标记为@pytest.mark.xfail的测试用例,如果是通过,显示XPASS

添加配置:
[pytest] xfail_strict = true
结果:如果通过,显示FAILED

markers:自定义注册标志
测试用例加了@pytest.mark.xxx修饰器(下面示例加在测试类上了),如果配置文件中没有配置markers就会报warnings
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
@pytest.fixture(params=['韧', '全栈测试笔记', '性能测试', '自动化测试', '测试开发'])
def fun(request): # 必须是request这个参数名
return request.param # 依次取列表中的每个值返回
@pytest.mark.case
class TestX:
def test_case(self, fun):
print(f"---test_case,data={fun}")
结果:是因为我们给测试方法打的标签,pytest识别不到

解决方案:https://docs.pytest.org/en/stable/how-to/mark.html

加上配置(可以加多个)
[pytest]
markers =
case
后面还可以加上说明
[pytest]
markers =
case: case marker
结果:没有warning了

log-cli:控制台实时输出日志
默认是false,log-cli=false,等价于:log_cli=0
示例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
@pytest.mark.xfail
class TestX:
def test_case(self):
print(f"---test_case")
assert 1==1
配置0
[pytest] log_cli=0
结果:

配置1
[pytest] log_cli=1
结果:展示更细了,可以看到测试类和测试方法

日志格式配置,详见:https://www.cnblogs.com/uncleyong/p/18017483
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True
示例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 韧
# @wx :ren168632201
# @Blog :https://www.cnblogs.com/uncleyong/
import pytest
@pytest.fixture(params=['韧', '全栈测试笔记', '性能测试', '测试开发'])
def fun(request): # 必须是request这个参数名
return request.param # 依次取列表中的每个值返回
class TestX:
def test_case(self, fun):
print(f"---test_case,data={fun}")
结果:用例名unicode编码展示

解决方案是配置文件中加上:
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True
结果:中文正常显示

其它方案,详见:https://www.cnblogs.com/uncleyong/p/18022091
__EOF__
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!

浙公网安备 33010602011771号