用 @pytest.mark.skip 跳过单个测试函数最简单明确,需写在函数上方、带括号,推荐注明 reason;@pytest.mark.skipif 用于条件跳过,condition 必须为字符串或可求值表达式;全局跳过用 -m 参数配合自定义标记;pytest.skip() 是运行时跳过,有 setup 成本且不推荐替代装饰器。

怎样用 @pytest.mark.skip 跳过单个测试函数
直接在测试函数上方加装饰器,是最简单、最明确的跳过方式。它不依赖外部条件,运行时无脑跳过,还会在 pytest 报告里标记为 skipped。
常见错误是把装饰器写在函数定义之后(比如写在 def 下一行但没对齐),或漏掉括号(@pytest.mark.skip() 才是正确调用,带括号)。
-
@pytest.mark.skip():无理由跳过,报告中显示skipped -
@pytest.mark.skip(reason="暂未实现"):推荐写明原因,方便团队理解 - 不能跳过类方法里的
setup_method或teardown_method—— 这些不是测试函数,标记无效
@pytest.mark.skip(reason="API 接口尚未提供")
def test_user_creation():
assert create_user() is not None
怎样用 @pytest.mark.skipif 按条件跳过测试
当跳过逻辑依赖环境、版本或配置时,@pytest.mark.skipif 是唯一可靠选择。它在收集测试阶段就判断条件,不执行函数体,也不触发 fixture。
容易踩的坑是误用运行时变量(比如在函数体内检查 os.getenv()),这会导致跳过失效——必须把判断逻辑写进 condition= 字符串里,或用可求值的布尔表达式。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 条件为
True时跳过,False时正常执行 - 推荐写成
@pytest.mark.skipif(sys.version_info - 避免写
@pytest.mark.skipif(os.getenv("CI") == "true", ...)——os未导入,会报NameError;应改用字符串形式:@pytest.mark.skipif("os.getenv('CI') == 'true'", ...)
怎样全局跳过带特定标记(mark)的一组测试
用 -m 参数配合 pytest.mark 自定义标记,是组织跳过策略的核心方式。它不修改代码,适合 CI/CD 中按需过滤。
关键点在于:标记名是任意字符串,但必须先用 @pytest.mark.你的标记名 显式打在测试上,否则 -m 无法识别。
- 给测试打标记:
@pytest.mark.slow、@pytest.mark.integration - 跳过所有
slow测试:pytest -m "not slow" - 只运行
unit测试:pytest -m unit - 多个条件组合:
pytest -m "not slow and not integration"
注意:如果命令行里用了 -m,但测试没打对应标记,pytest 默认会警告并跳过全部测试——这不是 bug,是设计行为,得检查标记名是否拼错或漏加。
为什么 pytest.skip() 不能替代装饰器
pytest.skip() 是运行时跳过,属于「测试内部主动退出」,和装饰器的「收集阶段跳过」有本质区别。它常被误用于想“动态决定是否跳过”的场景,但代价不小。
- fixture 已经执行完毕(比如数据库连接、临时文件创建)
- 测试状态已计入统计(报告里算作
skipped,但 setup 成本白花了) - 不能用在非测试函数里(比如 conftest.py 的 fixture 函数中调用会报错)
- 真正需要运行时判断时,优先考虑
@pytest.mark.skipif+ 可求值表达式,而不是塞进函数体
最易忽略的是:在参数化测试(@pytest.mark.parametrize)中混用 pytest.skip(),会导致部分参数实例跳过、部分执行,报告混乱且难以调试。

















