组件名称 核心作用 使用场景 典型生命周期 与其他组件关系
TestFixture 准备和清理(setUp/tearDown) 数据库连接/断开、临时文件创建/删除、模拟对象初始化 setUp() → 测试方法 → tearDown() 被TestCase继承使用
TestCase 测试最小执行单元(继承unittest.TestCase 编写具体测试方法(test_开头的方法) 实例化 → 执行测试方法 → 销毁 包含多个TestFixture,组成TestSuite
TestSuite 测试用例集合容器(可嵌套组合测试) 批量执行测试、自定义测试顺序、分组测试 添加测试用例 → 执行套件 → 生成报告 组合多个TestCase,交给TestRunner执行
TestRunner 测试执行的调度器和输出控制器(如TextTestRunner 控制测试输出格式(文本/HTML)、决定失败处理策略 加载TestSuite → 测试 → 输出结果 驱动TestSuite执行,生成测试报告

如下是按自定义顺序测试的例子
也可以修改 runner 的参数以自动匹配测试用例, 但执行顺序会自动按照字母序.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import unittest

def add(a,b):
return a+b
def minus(a,b):
return a-b
def multi(a,b):
return a*b
def divide(a,b):
return a/b

class TestBase(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("Start TestFunc")
cls.conf = {} # 可以定义一些类成员变量

cls.conf = {"db_path": "test.db"}

class TestFunc(TestBase):
# def setUp(self):
# print("do something before test : prepare environment")

# def tearDown(self):
# print("do something after test : clean up ")

# 测试方法均已test开头,否则是不被unittest识别的
def test_1_add(self):
print("add")
self.assertEqual(3,add(1,2))

def test_2_minus(self):
print("minus")
self.assertEqual(3,minus(5,2))

def test_3_multi(self):
print("multi")
self.assertEqual(6,multi(2 ,3))

def test_4_divide(self):
print("divide")
self.assertEqual(2,divide(4,2))

def suite():
"""创建自定义测试套件并指定执行顺序"""
suite = unittest.TestSuite()

# 按照指定顺序添加测试方法
suite.addTest(TestFunc("test_1_add"))
suite.addTest(TestFunc("test_2_minus"))
suite.addTest(TestFunc("test_4_divide"))
suite.addTest(TestFunc("test_3_multi"))

# 或者按照类
# loader = unittest.TestLoader()
# suite.addTest(loader.loadTestsFromTestCase(TestFunc))

return suite

# 如果直接运行此测试文件,使用自定义的suite
if __name__ == '__main__':
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite())



https://segmentfault.com/a/1190000016315201