课外活动:简单了解原生测试框架Unittest前置后置的逻辑
简单了解原生测试框架Unittest前置后置的逻辑
一、测试框架执行顺序解析
1.1 基础执行流程
import unittestclass A(unittest.TestCase):@classmethoddef setUpClass(cls):print(f"【CLASS START】{cls.__name__}")def setUp(self):print(f"【TEST START】{self._testMethodName}")def test_a(self):print("▶ 执行测试逻辑A")def test_b(self):print("▶ 执行测试逻辑B")def tearDown(self):print(f"【TEST END】{self._testMethodName}")@classmethoddef tearDownClass(cls):print(f"【CLASS END】{cls.__name__}")
1.2 执行顺序可视化
二、核心方法功能解析
2.1 类级别方法
方法 | 触发时机 | 执行次数 | 典型应用场景 |
---|---|---|---|
setUpClass() | 测试类初始化时 | 1次 | 数据库连接建立 |
tearDownClass() | 测试类所有方法执行完成后 | 1次 | 资源释放/日志归档 |
代码实现特征:
@classmethod
def setUpClass(cls):# 必须使用classmethod装饰器# 通过cls参数访问类属性# 不能直接调用实例方法
2.2 实例级别方法
方法 | 触发时机 | 执行次数 | 典型应用场景 |
---|---|---|---|
setUp() | 每个测试方法执行前 | N次(N=测试方法数) | 测试数据初始化 |
tearDown() | 每个测试方法执行后 | N次 | 环境清理/结果验证 |
方法调用关系:
测试启动
├── setUpClass()
│ ├── setUp() -> test_a() -> tearDown()
│ └── setUp() -> test_b() -> tearDown()
└── tearDownClass()
三、代码执行过程深度分析
3.1 实际执行日志
【CLASS START】A
【TEST START】test_a
▶ 执行测试逻辑A
【TEST END】test_a
【TEST START】test_b
▶ 执行测试逻辑B
【TEST END】test_b
【CLASS END】A
3.2 关键执行节点说明
-
类初始化阶段:
- 创建测试类实例前执行
setUpClass()
- 适用于全局配置加载
- 创建测试类实例前执行
-
测试方法执行周期:
-
类销毁阶段:
- 所有测试执行完毕后调用
tearDownClass()
- 必须使用
@classmethod
装饰器
- 所有测试执行完毕后调用
四、特殊场景处理机制
4.1 异常中断处理
def setUp(self):try:# 初始化操作except Exception as e:self.skipTest(f"初始化失败: {str(e)}")@classmethod
def tearDownClass(cls):if hasattr(cls, 'db_conn'):cls.db_conn.close() # 确保资源释放
4.2 多层级继承场景
class BaseTest(unittest.TestCase):@classmethoddef setUpClass(cls):print("父类初始化")class ChildTest(BaseTest):@classmethoddef setUpClass(cls):super().setUpClass() # 必须显式调用父类方法print("子类初始化")
五、最佳实践建议
-
资源管理原则:
- 在
setUpClass
中打开文件/数据库连接 - 在
tearDownClass
中关闭连接 - 在
setUp
中初始化测试数据 - 在
tearDown
中清理临时数据
- 在
-
执行效率优化:
"setUpClass" : 15 "tearDownClass" : 10 "setUp/tearDown" : 50 "测试逻辑" : 25
六、完整代码
"""
Python :3.13.3
Selenium: 4.31.0
"""import unittestclass A(unittest.TestCase):@classmethoddef setUpClass(cls):print(cls.setUpClass.__name__)def setUp(self):print(self.setUp.__name__)def test_a(self):print(self.test_a.__name__)def test_b(self):print(self.test_b.__name__)@classmethoddef tearDownClass(cls):print(cls.tearDownClass.__name__)def tearDown(self):print(self.tearDown.__name__)
「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀