前言
我们知道,命令行参数-m
可以运行指定标记的测试用例,像这样pytest.main(["-m", "p0"])
,当我们执行标记的测试用例时,会发现有警告信息PytestUnknownMarkWarning
。那该如何消除警告呢?果然,pytest
提供了强大的配置文件pytest.ini
,可以解决问题。到底该如何使用配置文件呢?带着疑问我们一起来探索。
pytest.ini
是啥呢?
pytest.ini
是 Pytest
的配置文件,它用于定义测试运行的行为和环境。该文件通常位于项目的根目录下,当执行 pytest
命令时,Pytest
会自动加载并应用其中的配置。
基本配置选项
markers
markers
选项允许您为测试函数添加标记,以便对测试进行分类或跳过特定的测试。
例如,我们可以定义一个smoke
标记用于标识快速运行的冒烟测试:
[pytest]
markers =
smoke: Run only smoke tests
然后,在测试函数上添加 @pytest.mark.smoke
装饰器即可将其标记为冒烟测试:
test_demo.py
import pytest
@pytest.mark.smoke
def test_login():
pass
我们控制台,输入命令执行pytest -v -m smoke test_demo.py
,发现已经没有警告信息了。
添加测试用例路径
pytest.ini
testpaths = /panda-test/peilian/test_dir/test_demo
可以把用例所在的目录添加到配置文件中,这样在运行用例的时候,pytest
会直接在配置文件所在的目录中搜索用例.
指定pytest忽略搜索目录
norecursedirs
选项定义了排除递归搜索的目录列表。默认情况下,Pytest 会在当前目录及其子目录中查找测试文件,但通过 norecursedirs
可以排除某些目录。
pytest.ini
norecursedirs = .git venv docs
指定在运行测试时要忽略的目录,上述配置将忽略 .git
、venv
和 docs
目录中的测试文件。
修改用例的搜索匹配规则
pytest
默认查找用例匹配规则:
- python_files(args)匹配Python用例文件,如test *.py、 *test.py。
- python_classes(args)匹配class类名称,如Test 。
- python_functions(args)匹配函数和class里面的方法,如test_*
也就是说测试文件以test_
开头或者以_test
结尾。测试类以Test
开头,并且不能带有init
方法。测试函数以test_
开头。
如果我们想匹配以 xxx_*.py的文件,该怎么办呢?在pytest.ini
中添加如下配置项
python_files = xxx_*.py *_xxx.py
python_classes = Test*
python_functions = test_*
好了,现在假设我们现在有一个login_pxl.py
文件,执行命令pytest
时,会发现该文件也会被找到执行了。这样就方便我们了,不需要重命名文件以test_
开头了。
控制台输出样式
在运行测试时设置控制台输出样式:
- classic:经典pytest输出。
- progress:类似于经典的pytest输出,但带有进度指示器。
- count:与进度类似,但进度显示为已完成的测试数而不是百分比。
默认值为progress,但可以退回到classic模式,代码如下:
console_output_style = classic
非预期失败显示FAILED
XFail(Expected Failure)是用于标记预期失败的测试的一种机制。通常在开发过程中,我们可能会遇到一些已知的问题或缺陷,但为了不中断测试运行,我们希望将这些失败的测试标记为 XFail。这样,在运行测试时,XFail 的测试将被视为预期失败,而不是实际的测试失败。
默认情况下,xfail_strict
的值为 false
,这意味着即使测试被标记为 XFail,如果测试实际通过了,它仍然会被视为成功。换句话说,即使标记为 XFail,只要测试通过,pytest
也不会产生任何警告或错误。
但是,当将 xfail_strict
设置为 true
时,pytest
将严格按照预期失败的定义来处理 XFail 的测试。即,只有当 XFail 的测试实际失败时,pytest
才会将其视为正确行为,否则将引发警告或错误。
通过将 xfail_strict
设置为 true
,你可以确保 XFail 的测试只有在预期失败时才被认为是正确的,这有助于更好地追踪和管理测试的状态。
xfail_strict = true
cache_dir缓存目录设置
如果你看过笔者之前的文章:利用 Pytest Cache Fixture 实现测试结果缓存,你会知道,默认缓存文件会在.pytest_cache
目录下,如果想修改改路径,可以进行如下设置:
cache_dir = pxl/cache/directory
将 pxl/cache/directory
替换为你想要用作缓存目录的实际路径。
关于 cache_dir
的注意事项:
pytest
不会自动创建它。cache_dir
,则缓存文件将存储在默认的临时目录中。cache_dir
。--cache-dir
参数,它会覆盖配置文件中的设置。通过配置 cache_dir
,你可以选择将缓存文件存储在特定的位置,这对于提高测试运行速度和重复利用缓存信息非常有用。缓存目录通常用于存储一些中间结果、前置条件或其他需要在多个测试之间共享的数据。
filterwarnings警告过滤
用于过滤或控制如何处理测试期间生成的警告信息。
filterwarnings =
ignore:warning message to ignore:WarningType
default:warning category to show:WarningType
error:warning category to treat as error:WarningType
上述示例中的 filterwarnings
部分包含了三个指令:
ignore
: 忽略特定的警告消息,不会在测试运行期间显示。default
: 使用默认行为处理特定的警告类别,将在测试运行期间显示。error
: 将特定的警告类别视为错误,如果出现这些警告,测试将失败。具体来说,每个指令由三个部分组成:
ignore
、default
或 error
。WarningType
)。如果省略警告类型,将适用于所有警告。使用场景:
filterwarnings =
ignore:.*deprecated.*:DeprecationWarning
default::PendingDeprecationWarning
error:.*:RuntimeWarning
上述示例中的指令分别表示:
- 忽略任何包含 "deprecated" 关键字的警告消息,并且警告类型为
DeprecationWarning
。 - 使用默认行为(显示)处理任何
PendingDeprecationWarning
类型的警告。 - 将所有
RuntimeWarning
类型的警告视为错误。
通过配置 filterwarnings
,你可以控制测试期间生成的警告信息的显示、忽略或将其视为错误。这有助于确保测试的稳定性和一致性。
添加pytest执行默认参数选项
addopts
选项允许向 pytest 命令行传递额外的选项。
可以使用 addopts
在命令行中指定一系列选项和参数,而不必每次都手动输入它们。
addopts = -s -v --maxfail=2
上述示例配置了三个选项:
-s
: 允许在测试运行过程中输出打印语句。-v
: 增加详细的测试结果信息输出。--maxfail=2
: 指定在出现两个测试失败后停止测试运行。
使用 addopts
可以根据需要自定义附加的选项和参数。多个选项和参数可以通过空格进行分隔。
minversion设置及限制
指定运行测试所需的最低版本号。如果 pytest
安装的版本低于指定的版本,那么在运行测试时就会提示错误。
minversion = 6.0
如果当前安装的 pytest
版本小于 6.0
,则运行测试时会显示以下错误信息:
Copy CodeERROR: pytest 5.2.0 requires at least pytest 6.0.0; you have pytest 5.1.2.
这说明当前安装的 pytest
版本太低,需要升级到 6.0
或以上版本才能继续运行测试。
需要的插件
equired_plugins
是 pytest
的一个配置选项,用于指定在运行测试时必需加载的插件。
required_plugins = pytest-cov pytest-html
上述示例中,required_plugins
设置了两个插件:pytest-cov
和 pytest-html
。这意味着在运行测试时,pytest
会自动加载这两个插件。
最后
通过深入了解 pytest.ini 的使用方法和扩展功能,我们可以更好地优化测试配置,并根据项目的需求添加自定义特性。我们可以充分发挥 pytest.ini 的威力,提高测试效率和质量。