14. 原生测试框架Unittest的skip、skipIf、skipUnless的使用

14. 原生测试框架Unittest的skip、skipIf、skipUnless的使用

一、跳过机制核心装饰器解析

1.1 装饰器功能对照表

装饰器 触发条件 典型应用场景
@skip 无条件跳过 维护中/未完成的测试用例
@skipIf 条件为True时跳过 环境依赖检查
@skipUnless 条件为False时跳过 平台特性验证

二、类级别跳过控制实现

2.1 全局跳过示例

python 复制代码
@skip  # 类装饰器
class A(unittest.TestCase):
    def test_a1(self):
        self.assertEqual(1, 2)  # 不会执行
        
    @skip  # 方法装饰器(冗余设置)
    def test_a2(self): ...      # 不会执行
执行特征:

Runner TestCase 发现测试类 检测到类级@skip 标记所有方法为跳过 不执行任何方法 Runner TestCase


三、条件跳过深度解析

3.1 环境条件检测

python 复制代码
@skipIf(name != 'nt', '非Windows系统跳过')  # 检查操作系统
class B(unittest.TestCase):
    @skipIf(version_info[0] < 3, 'Python3以下版本跳过')
    def test_b1(self): ...  # 当Python主版本<3时跳过
    
    @skipUnless('win' in platform, '非Windows平台跳过') 
    def test_b2(self): ...  # 当平台不包含win时跳过

3.2 条件表达式组成

表达式 检测目标 返回值逻辑
name != 'nt' 操作系统类型 Windows返回False
version_info[0] < 3 Python主版本号 3.x版本返回False
'win' in platform 平台信息字符串 含win返回True

四、执行流程控制逻辑

4.1 装饰器优先级规则

类装饰器 方法装饰器 父类装饰器 子类装饰器 skipUnless skipIf skip 具体条件装饰器

4.2 多层控制示例

python 复制代码
@skipIf(condition1, '')  # 第一层过滤
class MyTest(unittest.TestCase):
    @skipUnless(condition2, '')  # 第二层过滤
    def test_case(self): ...
执行判定流程:
  1. 检查类级别条件condition1
  2. 通过后检查方法级别condition2
  3. 双重条件均满足时执行测试

五、最佳实践指南

5.1 跳过的正确用法

python 复制代码
# 推荐写法
@skipIf(not has_feature('ocr'), '缺少OCR模块支持')  
def test_image_recognition(): ...

# 不推荐写法
if not has_feature('ocr'):
    pass  # 会标记为成功而非跳过
else:
    def test_image_recognition(): ...

5.2 报告输出优化

python 复制代码
@skipUnless(
    platform.system() == 'Darwin',
    '要求MacOS系统 | 当前系统: {}'.format(platform.system())
)

输出示例:
SKIP: 要求MacOS系统 | 当前系统: Linux


六、高级应用场景

6.1 动态跳过机制

python 复制代码
def skip_on_exception(func):
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            raise unittest.SkipTest(f"预检失败: {str(e)}")
    return wrapper

@skip_on_exception
def test_database(): ...

6.2 跨模块条件复用

python 复制代码
# common.py
WIN_ONLY = skipUnless(platform.system() == 'Windows', '仅限Windows')

# test_module.py
@WIN_ONLY
def test_windows_feature(): ...

七、完整代码

python 复制代码
"""
Python :3.13.3
Selenium: 4.31.0

test_module_1.py
"""

import unittest
from unittest import skip, skipIf, skipUnless
from os import name
from sys import version_info, platform


# @skip
class A(unittest.TestCase):

    def test_a1(self):
        self.assertEqual(1, 2)

    @skip
    def test_a2(self):
        ...


@skipIf(name != 'nt', '')
class B(unittest.TestCase):

    @skipIf(version_info[0] < 3, '')
    def test_b1(self):
        ...

    @skipUnless('win' in platform, '')
    def test_b2(self):
        ...

「小贴士」 :点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

相关推荐
默_笙17 小时前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
qq_4260039617 小时前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫17 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技17 小时前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读18 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时18 小时前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
奇思妙想聪明勤奋的小羊19 小时前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd12319 小时前
2026年第38周GitHub趋势周报
python·科技·github
IZero0719 小时前
Jev 与 Laya
python·语言模型