如何使用@pytest.mark.xxx在pytest中自定义标签,并通过-m参数过滤运行特定模块?
- 内容介绍
- 文章标签
- 相关推荐
本文共计538个文字,预计阅读时间需要3分钟。
在测试函数或类上添加装饰器进行特性化标记,以便在测试运行时识别并执行特定的测试用例。以下是一个示例,展示了如何标记一个测试用例为慢速测试:
pytest -m 怎么精准筛选带标签的测试
命令行用 -m 后跟表达式,不是简单字符串匹配:
-
pytest -m slow→ 运行所有打了@pytest.mark.slow的测试 -
pytest -m "not slow"→ 排除slow,运行其余 -
pytest -m "slow and integration"→ 必须同时有这两个标签 -
pytest -m "smoke or fast"→ 满足其一即可
-m smoke 会把函数名含 smoke 的测试也拉进来(比如 test_smoked_bacon),因为 pytest 默认做“名称模糊匹配”。要严格按标签过滤,得加引号:-m "smoke"。
自定义标签需要注册吗?不注册会怎样
不注册也能用,但会收到 PytestUnknownMarkWarning 警告,不影响执行。注册后能禁用未定义标签、支持 IDE 补全、避免手误。注册方式是在 pyproject.toml 或 pytest.ini 里写:
[tool:pytest]
markers =
slow: marks tests as slow (deselect with '-m "not slow"')
integration: requires external service注意:路径必须是项目根目录下的配置文件;如果用了 pyproject.toml,section 名得是 [tool.pytest.ini_options],否则不生效。
多个 @pytest.mark.xxx 能叠加使用吗
能,而且很常用,比如一个测试既慢又依赖网络:
@pytest.mark.slow
@pytest.mark.network
def test_download_large_file():
...这时 pytest -m "slow and network" 才能命中。但要注意:pytest 不保证标签执行顺序,所以别指望靠多个 @pytest.mark.parametrize 或 @pytest.mark.usefixtures 的叠加来控制逻辑流程——它们是并列元数据,不是执行栈。
本文共计538个文字,预计阅读时间需要3分钟。
在测试函数或类上添加装饰器进行特性化标记,以便在测试运行时识别并执行特定的测试用例。以下是一个示例,展示了如何标记一个测试用例为慢速测试:
pytest -m 怎么精准筛选带标签的测试
命令行用 -m 后跟表达式,不是简单字符串匹配:
-
pytest -m slow→ 运行所有打了@pytest.mark.slow的测试 -
pytest -m "not slow"→ 排除slow,运行其余 -
pytest -m "slow and integration"→ 必须同时有这两个标签 -
pytest -m "smoke or fast"→ 满足其一即可
-m smoke 会把函数名含 smoke 的测试也拉进来(比如 test_smoked_bacon),因为 pytest 默认做“名称模糊匹配”。要严格按标签过滤,得加引号:-m "smoke"。
自定义标签需要注册吗?不注册会怎样
不注册也能用,但会收到 PytestUnknownMarkWarning 警告,不影响执行。注册后能禁用未定义标签、支持 IDE 补全、避免手误。注册方式是在 pyproject.toml 或 pytest.ini 里写:
[tool:pytest]
markers =
slow: marks tests as slow (deselect with '-m "not slow"')
integration: requires external service注意:路径必须是项目根目录下的配置文件;如果用了 pyproject.toml,section 名得是 [tool.pytest.ini_options],否则不生效。
多个 @pytest.mark.xxx 能叠加使用吗
能,而且很常用,比如一个测试既慢又依赖网络:
@pytest.mark.slow
@pytest.mark.network
def test_download_large_file():
...这时 pytest -m "slow and network" 才能命中。但要注意:pytest 不保证标签执行顺序,所以别指望靠多个 @pytest.mark.parametrize 或 @pytest.mark.usefixtures 的叠加来控制逻辑流程——它们是并列元数据,不是执行栈。

