likes
comments
collection
share

深入了解pytest.ini:优化测试配置与扩展功能

作者站长头像
站长
· 阅读数 13

前言

我们知道,命令行参数-m可以运行指定标记的测试用例,像这样pytest.main(["-m", "p0"]),当我们执行标记的测试用例时,会发现有警告信息PytestUnknownMarkWarning。那该如何消除警告呢?果然,pytest提供了强大的配置文件pytest.ini,可以解决问题。到底该如何使用配置文件呢?带着疑问我们一起来探索。

pytest.ini 是啥呢?

pytest.iniPytest 的配置文件,它用于定义测试运行的行为和环境。该文件通常位于项目的根目录下,当执行 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

指定在运行测试时要忽略的目录,上述配置将忽略 .gitvenvdocs 目录中的测试文件。

修改用例的搜索匹配规则

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缓存目录设置

cache_dir = pxl/cache/directory

pxl/cache/directory 替换为你想要用作缓存目录的实际路径。

关于 cache_dir 的注意事项:

  1. 缓存目录应该是一个存在的文件系统路径,pytest 不会自动创建它。
  2. 如果未指定 cache_dir,则缓存文件将存储在默认的临时目录中。
  3. 可以使用相对路径或绝对路径来设置 cache_dir
  4. 如果在命令行上使用 --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 部分包含了三个指令:

  1. ignore: 忽略特定的警告消息,不会在测试运行期间显示。
  2. default: 使用默认行为处理特定的警告类别,将在测试运行期间显示。
  3. error: 将特定的警告类别视为错误,如果出现这些警告,测试将失败。

具体来说,每个指令由三个部分组成:

  1. 指令类型:ignoredefaulterror
  2. 警告消息或类别:可以是完整的警告消息字符串或警告类别。
  3. 警告类型:可选参数,指定要过滤的警告类的全名(例如 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_pluginspytest 的一个配置选项,用于指定在运行测试时必需加载的插件。

required_plugins = pytest-cov pytest-html

上述示例中,required_plugins 设置了两个插件:pytest-covpytest-html。这意味着在运行测试时,pytest 会自动加载这两个插件。

最后

通过深入了解 pytest.ini 的使用方法和扩展功能,我们可以更好地优化测试配置,并根据项目的需求添加自定义特性。我们可以充分发挥 pytest.ini 的威力,提高测试效率和质量。