单元测试框架Unittest
- 格式:pdf
- 大小:162.67 KB
- 文档页数:11
单元测试框架Unittest
Unittest官⽅ 4个重要概念:
Test fixture(测试固件):初始化、清除
Test case(测试⽤例),test suite(测试套件),test runner(测试运⾏器)
两种单元测试加载⽅法:
1.unittest.main()
2.将所有test case 添加到test suit中,然后⼀次性加载
知识点:
1.测试类要继承unittest.TestCase类
2.每个⽤例⽅法 test开头(self)
3.setUp和tearDown⽅法在每个⽤例执⾏前后都会执⾏
4.unittest.main()执⾏同⼀模块内unittest⼦类所有⽅法
实例
被测试模块 Calc.py
后续部分⽤例会引⽤此模块
1 # coding=utf-8
2 class Calc(object):
3 def add(self, x, y, *d):
4 # 加法计算
5 result = x + y
6 for i in d:
7 result += i
8 return result
9
10 def sub(self, x, y, *d):
11 # 减法计算
12 result = x - y
13 for i in d:
14 result -= i
15 return result
16
17 @classmethod
18 def mul(cls, x, y, *d):
19 # 乘法计算
20 result = x * y
21 for i in d:
22 result *= i
23 return result
24
25 @staticmethod
26 def div(x, y, *d):
27 # 除法计算
28 if y != 0:
29 result = x / y
30 else:
31 return -1
32 for i in d:
33 if i != 0:
34 result /= i
35 else:
36 return -1
37 return result
例⼦1 ⽤例初始化清除setUp、tearDown
1 #encoding=utf-8
2 import unittest
3 import random
4 class TestSequenceFunctions(unittest.TestCase):
5 def setUp(self):
6 # 初始化⼀个递增序列
7 self.seq = range(10)
8 print "setup completed!"
9
10 def test_run(self):
11 # 从序列seq中随机选取⼀个元素
12 element = random.choice(self.seq)
13 # 验证随机元素确实属于列表中
14 self.assertTrue(element in self.seq)
15
16 def test_sth(self):
17 assert 1==1
18
19 def tearDown(self):
20 print "tearDown completed"
21
22 class TestDictValueFormatFunctions(unittest.TestCase):
23 def setUp(self):
24 self.seq = range(10)
25
26 def test_shuffle(self):
27 # 随机打乱原seq的顺序
28 random.shuffle(self.seq)
29 self.seq.sort()
30 self.assertEqual(self.seq, range(10))
31 # 验证执⾏函数时抛出了TypeError异常
32 self.assertRaises(TypeError, random.shuffle, (1, 2, 3))
33
34 if __name__ == '__main__':
35 unittest.main()
例⼦2 类初始化清除setUpClass(cls)、tearDownClass(cls)
类⾥所有⽤例执⾏前后仅执⾏⼀次
1 #encoding=utf-8
2 import unittest
3
4 # 被测试类
5 class myclass(object):
6 @classmethod
7 def sum(self, a, b):
8 return a + b #将两个传⼊参数进⾏相加操作
9
10 @classmethod
11 def sub(self, a, b):
12 return a - b #将两个传⼊参数进⾏相减操作
13
14
15 class mytest(unittest.TestCase):
16 @classmethod
17 def setUpClass(cls):
18 "初始化类固件"
19 print "----setUpClass"
20
21 @classmethod
22 def tearDownClass(cls):
23 "重构类固件"
24 print "----tearDownClass"
25
26 # 初始化⼯作
27 def setUp(self):
28 self.a = 3
29 self.b = 1
30 print "--setUp"
31
32 # 退出清理⼯作
33 def tearDown(self):
34 print "--tearDown"35
36 # 具体的测试⽤例,⼀定要以test开头
37 def testsum(self):
38 # 断⾔两数之和的结果是否是4
39 self.assertEqual(myclass.sum(self.a, self.b), 4, 'test sum fail')
40
41 def testsub(self):
42 # 断⾔两数之差的结果是否是2
43 self.assertEqual(myclass.sub(self.a, self.b), 2, 'test sub fail')
44
45
46 if __name__ == '__main__':
47 unittest.main() # 启动单元测试
例⼦3 按特定顺序执⾏⽤例
unittest框架⽤例执⾏顺序是按照⽤例名字符的ASCII码顺序
⽤例数⼩于10:可将⽤例名命名为test加0-9, 按数字由⼩到⼤顺序执⾏
⽤例数⼤于10:可将⽤例名字⾸字母开始命名 a-Z按顺序执⾏,如第⼀字母相同,则第⼆字母再按a-Z顺序排序,以此类推
suit.addTest(class(‘testcase’)) 按此⽅式添加的⽤例会按添加顺序执⾏
此代码需要⽂本开头的被测试模块Calc.py
1 #encoding=utf-8
2 import unittest
3 from Calc import Calc
4
5 class MyTest(unittest.TestCase):
6
7 @classmethod
8 def setUpClass(self):
9 print u"单元测试前,创建Calc类的实例"
10 self.c = Calc()
11
12 # 具体的测试⽤例,⼀定要以test开头,执⾏顺序按照字母顺序开头
13 def test_0add(self):
14 print "run add()"
15 self.assertEqual(self.c.add(1, 2, 12), 15, 'test add fail')
16
17 def test_1sub(self):
18 print "run sub()"
19 self.assertEqual(self.c.sub(2, 1, 3), -2, 'test sub fail')
20
21 def test_2mul(self):
22 print "run mul()"
23 self.assertEqual(Calc.mul(2, 3, 5), 30, 'test mul fail')
24
25 def test_3div(self):
26 print "run div()"
27 self.assertEqual(Calc.div(8, 2, 4), 1, 'test div fail')
28
29 if __name__ == '__main__':
30 unittest.main()# 启动单元测试
31
32
33 if __name__ == '__main__':
34 suite = unittest.TestSuite()
35 suite.addTest(MyTest(‘test_2mu’))
36 suite.addTest(MyTest(‘test_1sub’))
37 runner = unittest.TextTestRunner()
38 runner.run(suite)
例⼦4 忽略测试⽅法,不想执⾏的⽤例,可跳过
unittet可以分⽆条件忽略和有条件忽略,通过装饰器实现
跳过⽤例时打印括号内后⾯参数的内容(跳过原因)
@unittest.skip(reason) 装饰器:⽆条件跳过装饰的测试,并说明跳过测试的原因。