You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何标记测试为‘long’并跳过?基于tox+pytest的实现方法

实现通过@long装饰器标记并跳过耗时测试的方案

我来给你一步步拆解怎么实现这个需求,其实借助pytest的标记系统和tox的参数传递就能轻松搞定:

1. 定义@long装饰器并注册pytest标记

因为你用的是unittest.TestCase同时搭配pytest运行测试,我们可以直接复用pytest的标记机制来封装@long装饰器。

首先在项目根目录创建conftest.py(这是pytest的专属配置文件,会自动被识别),添加以下代码:

import pytest

# 封装自定义的@long装饰器,本质是绑定pytest的标记
def long(func):
    return pytest.mark.long(func)

然后在项目根目录创建或修改pytest.ini,注册这个标记避免运行时警告:

[pytest]
markers =
    long: 标记耗时较长的测试用例

这样你的测试代码里的@long装饰器就能和示例代码完全一致地使用了。

2. 添加--skip-long命令行参数实现跳过逻辑

接下来要让pytest识别--skip-long参数,触发时跳过所有标记了long的测试。继续在conftest.py里添加以下代码:

def pytest_addoption(parser):
    # 注册--skip-long命令行选项
    parser.addoption(
        "--skip-long",
        action="store_true",
        default=False,
        help="跳过所有标记为@long的耗时测试用例"
    )

def pytest_collection_modifyitems(config, items):
    # 检测是否传入了--skip-long参数
    if config.getoption("--skip-long"):
        # 创建一个跳过标记,附带说明
        skip_long = pytest.mark.skip(reason="使用--skip-long参数跳过耗时测试")
        # 遍历所有收集到的测试用例,给标记了long的用例添加跳过标记
        for item in items:
            if "long" in item.keywords:
                item.add_marker(skip_long)

这段代码的作用是:

  • 给pytest新增--skip-long命令行开关,默认不启用
  • 当开关开启时,自动给所有带long标记的测试用例加上跳过标记

3. 配置tox传递参数给pytest

最后要让tox支持传递--skip-long参数给pytest。修改你的tox.ini文件,在[testenv]部分调整commands配置:

[testenv]
# 用{posargs}接收tox命令后传入的参数,传递给pytest
commands = pytest {posargs}
deps =
    pytest
    # 这里添加你的项目依赖,比如unittest(其实pytest自带兼容)

现在你就可以通过以下命令运行测试了:

  • 运行所有测试(包括耗时的):tox
  • 跳过耗时测试:tox -- --skip-long

这里的--是tox的标准用法,用来区分tox自身的参数和要传递给测试命令的参数,这样tox会把后面的--skip-long原封不动传给pytest。

验证效果

你可以直接用pytest测试功能是否正常:

  • 正常运行所有测试:pytest
  • 跳过耗时测试:pytest --skip-long

对于你的unittest.TestCase测试用例,pytest完全兼容,所以标记和跳过逻辑都能正常生效。

内容的提问来源于stack exchange,提问作者Martin Thoma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:46:17