Python单元测试——unittest

本文详细介绍了 Python 自带的 unittest 测试模块的基本概念及使用流程,包括 TestCase、TestSuite、TestLoader 和 TestRunner 的作用及相互之间的联系,并解释了 fixture 的设置方法。

unittest是python自带的一个模块

python344\Lib\unittest

官方参考文档: http://docs.python.org/2.7/library/unittest.html

原理类似于java的junit

4个重要的概念:test fixture, test case, test suite, test runner

test case:

一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

TestSuite:

而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。

TestLoader:

加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。

TextTestRunner:

执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。

TextTestResult:

测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。

整个流程:

首先是要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。

fixture:

对一个测试用例环境的搭建和销毁,通过覆盖(重写)TestCase的setUp()和tearDown()方法来实现。

 

以下是load的实现原理,如何把case绑定成suite。见loader.TestLoader类中的loadTestsFromTestCase()方法:

 1     def loadTestsFromTestCase(self, testCaseClass):
 2         """Return a suite of all tests cases contained in testCaseClass"""
 3         if issubclass(testCaseClass, suite.TestSuite):        //判断第一个参数是否是第二个参数的子类,是返回true
 4             raise TypeError("Test cases should not be derived from testsuite.  //testcase不应该再从testsuite衍生了
 5                              Maybe you meant to derive from testcase?" //也许是要从testcase衍生?
 6                             )
 7         testCaseNames = self.getTestCaseNames(testCaseClass)  //getTestCaseNames()是从TestCase这个类中找所有以“test”开头的方法
 8         if not testCaseNames and hasattr(testCaseClass, 'runTest'):
 9             testCaseNames = ['runTest']
10         loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
11         return loaded_suite

 

可见,对每一个以test开头的方法,都为其构建了一个TestCase对象,值得注意的是,如果没有定义test开头的方法,而是将测试代码写到了一个名为runTest的方法中,那么会为该runTest方法构建TestCase对象,如果定义了test开头的方法,就会忽略runTest方法。

 

至此,基本就清楚了,每一个以test开头的方法,都会为其构建TestCase对象,也就是说TestSequenceFunctions类中其实定义了三个TestCase,之所以写成这样,是为了方便,因为这几个测试用例的fixture是相同的,如果每一个测试用例单独写成一个TestCase的话,会有很多的冗余代码。

 

转载于:https://www.cnblogs.com/mogujiang/p/5682420.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值