单元测试框架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) 装饰器:⽆条件跳过装饰的测试,并说明跳过测试的原因。