单元测试框架(二)

单元测试的基本特征

重要的概念

1.Test Case

  类是一种将抽象转化成用户定义类型的C++工具,它将数据表示操纵数据的方法组合成一个整洁的包。而对象则是一个类的实例。一个TestCase的实例就是一个测试用例。什么是测试用例呢?测试用例就是一个完整的测试流程,包括测试前准备环境的搭建(setUp)、实现测试过程的代码(run),以及测试后环境的还原(tearDown)。单元测试(unit test)的本质:一个测试用例即一个完整的测试单元,通过运行这个测试单元,来对某一个功能进行验证,是否符合预期结果。

2.Test Suite

  验证一个功能往往需要多个测试用例,而测试套件TestSuite则可以把多个测试用例集合在一起来执行,可以通过TestSuite类提供的addTest()方法来添加测试用例。

3.Test Runner

  测试的执行——一般单元测试框架中都会提供丰富的执行策略和执行结果。在unittest单元测试框架中,通过TextTestRunner类提供的run()方法来执行test suite / test case。test runner可以使用图形界面、文本界面,或返回一个特殊的值等方式来表示测试执行的结果。

4.Test Fixture

  一个fixture意味着对一个测试用例环境的搭建和销毁,分别通过覆盖TestCase类setUp()tearDown()方法来实现。有什么用呢?很多情况下我们执行一个测试用例时会先查数据库,看看这个用户是否满足这条测试用例执行的初始条件。举个简单的例子,我想测试提现这个功能,而提现功能只对认证会员开放,那么这个时候我就会访问数据库,如果这个用户是普通会员,那么我会先修改对应的键值来满足该功能测试的初始条件。比如说在这个测试用例中需要访问数据库,那么我们可以在setUp()中建立数据库连接来进行初始化,在tearDown()中清除数据库产生的数据。earDown()的过程很重要,要为下一个test case留下一个干净的环境。

>>>优化单元测试框架(一)的单元测试用例<<<

先来附上单元测试框架(一)里面的被测试类Count

 1 #calculator.py
 2 
 3 #计算器类
 4 class Count:
 5 
 6     #通过__init()__方法对两个数进行初始化
 7     def __init__(self,a,b):
 8         self.a = float(a)
 9         self.b = float(b)
10 
11     #加法
12     def add(self):
13         return round(self.a + self.b,2)

结合上述概念后,改良后的单元测试用例如下:

 1 #unittest_calculator.py
 2 
 3 from calculator import Count
 4 import unittest
 5 #python2.1以后的版本已经将unittest作为一个标准模块放在python开发包中
 6 
 7 #创建TestCount类来继承unittest模块的TestCase类
 8 class TestCount(unittest.TestCase):
 9 
10     #测试用例环境的搭建
11     def setUp(self):
12         print("test start")
13 
14     #测试两个浮点数相加
15     def test_add1(self):
16         
17         #tep1.调用Count类并传入要计算的数(3.111,6.229)
18         c = Count(3.111,6.229)
19         #tep2.调用Count类中的add()方法得到两数相加的返回值
20         #tep3.调用unittest框架所提供的assertEqual()方法对add()的返回值进行断言,判断程序执行结果和预期值是否相符,免去之前烦琐的异常处理
21         self.assertEqual(c.add(),9.34)
22 
23     def test_add2(self):
24         c = Count(3,6)
25         self.assertEqual(c.add(),9.00)
26 
27     def Test_add3(self):
28         c = Count(3.5,6.5)
29         self.assertEqual(c.add(),10.00)
30 
31     #测试用例环境的销毁
32     def tearDown(self):
33         print("test end")
34 
35 
36 #__name__作为模块的调用方式,如果等于__main__,则表示直接调用
37 if __name__ == '__main__':
38 
39     #构建测试集
40     suite = unittest.TestSuite()
41     suite.addTest(TestCount("test_add2"))
42     suite.addTest(TestCount("Test_add3"))
43 
44     #调用unittest框架的TextTestRunner()类的run()方法来运行suite组装的测试用例
45     runner = unittest.TextTestRunner()
46     runner.run(suite)

运行结果:

======= RESTART: C:\Haauleon\Unittest\20180422\unittest_calculator.py =======
test start
test end
.test start
test end
.
----------------------------------------------------------------------
Ran 2 tests in 0.075s

OK

猜你喜欢

转载自www.cnblogs.com/haauleon/p/8908975.html