如何标记测试为‘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
相关产品推荐
相关产品推荐

