单元测试的基本特征
重要的概念
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