python标准库之测试框架

python标准库中的unittest模块提供了一系列创建和运行测试的工具。

测试用例TestCase

每一个单独的测试方法都叫做一个TestCase,我们给待测的代码A一个input,A返回给我们一个response,我们需要check一下response是不是所期望的,就能判断出A写的对不对。这整个测试过程都在TestCase中执行。

1、常用的断言函数

对结果进行check一般都是采用断言函数,判断被测函数写的是否正确。

1
2
3
4
5
6
7
8
9
10
11
12
assertEqual(a, b)   # 断言a和b是否相等,相等则测试用例通过
assertNotEqual(a, b) # 断言a和b是否相等,不相等则测试用例通过
assertTrue(x) # 断言x是否True,是True则测试用例通过
assertFalse(x) # 断言x是否False,是False则测试用例通过
assertIs(a, b) # 断言a是否是b,是则测试用例通过
assertNotIs(a, b) # 断言a是否是b,不是则测试用例通过
assertIsNone(x) # 断言x是否None,是None则测试用例通过
assertIsNotNone(x) # 断言x是否None,不是None则测试用例通过
assertIn(a, b) # 断言a是否在b中,在b中则测试用例通过
assertNotIn(a, b) # 断言a是否在b中,不在b中则测试用例通过
assertIsInstance(a, b) # 断言a是b的一个实例,是则测试用例通过
assertNotIsInstance(a, b) # 断言a不是b的一个实例,不是则测试用例通过

2、测试用例的编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from unittest import TestCase
import unittest

def average(values):
return sum(values) / len(values)

class TestAverage(TestCase):
'''
对求平均函数的测试用例
'''
def test_average1(self):
self.assertEqual(average([20, 30, 70]), 40.0)
self.assertEqual(round(average([1, 5, 7]), 0), 4)

def test_average2(self):
self.assertEqual(average([20, 30, 70]), 40.0)
self.assertEqual(round(average([1, 5, 7]), 1), 4.3)

def test_average3(self):
data = [1, 2, 3, 4, 5, 6]
self.assertEqual(average(data), 3.5)

if __name__ == '__main__':
unittest.main()

测试套件TestSuite

TestSuite是多个TestCase的集合。

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
from unittest import TestCase
import unittest

def average(values):
return sum(values) / len(values)

def sumfun(values):
return sum(values)

class TestAverage(TestCase):
'''
对求平均函数的测试用例
'''
def test_average1(self):
self.assertEqual(average([20, 30, 70]), 40.0)
self.assertEqual(round(average([1, 5, 7]), 0), 4)

def test_average2(self):
self.assertEqual(average([20, 30, 70]), 40.0)
self.assertEqual(round(average([1, 5, 7]), 1), 4.3)

def test_average3(self):
data = [1, 2, 3, 4, 5, 6]
self.assertEqual(average(data), 3.5)

class TestSum(TestCase):
'''
对求和函数的测试用例
'''
def test_sum1(self):
self.assertEqual(sumfun([20, 30, 70]), 120.0)

def test_sum2(self):
self.assertEqual(sumfun([1, 0.5, -10]), -8.5)

if __name__ == '__main__':
# 创建一个测试集合
test_suite = unittest.TestSuite()
# 往测试套件中添加测试用例
test_suite.addTest(TestSum('test_sum1'))
test_suite.addTest(TestAverage('test_average1'))

# 使用Test Runner来执行Test Suite打包的Case, verbosity=2代表打印的日志级别
myrunner = unittest.TextTestRunner(verbosity=2)
myrunner.run(test_suite)