python中的测试

python中的单元测试模块(unittest)使用的方法是类似于JUnit的标准方法。一般一个测试代码在一个单独的模块中。

#########################
测试代码在一个单独模块中的原因:(zzLibrary reference)
1。可以独立运行。
2。可以和产品代码相分离。
3。测试代码较之代码不易改变。
4。测试代码可以较容易的改变。
5。C模块的测试代码必然是在一个不同的模块中的。
6。如果测试策略变化了,代码不必要改变。

#########################
其中重要的感念有:
test fixture:是测试的环境,使用方法setUp()和tearDown()来体现。他们分别包含测试开始和结束时要执行的动作。

test case:是测试的最小单位,用来测试对应一定的输入是否可以得到期望的输出。可以基于TestCase或是FunctionTestCase。也可以自己写一个。其中重要的比较结果的函数是assertEqual()(用来比较结果相同)、assert_()(用来确定条件是否符合)、assertRaise()(用来确定是否有期望的异常发生)
test suite:test case或test suite的集合。
test runner:提供测试的启动和结果的输出,unittest提供TextTestRunner。

整个测试框架的过程是这样设计的。首先定义一个TestResult类,这个类的主要作用是保存测试中的结果。然后通过testLoader来得到从一些testCase或是testSuite来得到最终的testSuite。然后定义一个runner用来使用run()方法,在这个方法中给作为参数的测试实例一个TestResult实例(或是子类的实例),将这个实例作为调用testSuite的run()方法的参数。这样当方法返回的时候,结构就已经在testResult中了,最后在runner中解释这些结果。

###########################
如何进行测试:
在继承TestCase之后,中间的runTest()方法就是要执行的测试。例如:
import unittest

class GameTest(unittest.TestCase):
    def runTest(self):
        self.assertEqual(1,1)
因为一个类中只能有一个runTest(),所以如果有很多的测试实例,则多次的生成实例是不现实的。

一个解决的方法是在从TestCase继承得到的类中使用test开头的方法名来表示这个方法是需要被运行的测试。
class GameTest(unittest.TestCase):
    def testGame1(self):
        self.assertEqual(1,1)
    def testGame2(self):
....
这样在一个类中间就有多个测试了。

多个TestCase在一起或是TestSuite在一起,就组成了TestSuite。有多种的用法。相关的方法有:
unittest.TestSuite()这是初始化一个TestSuite
suite.addTest()这是向一个TestSuite添加一个TestCase
unittest.makeSuite()这是直接从一个TestCase的类生成一个TestSuite。

当TestCase或是TestSuite都准备好的时候,可以使用多种方法运行测试。
1。
if __name__ == '__main__':
    unittest.main()
2。
unittest.TextTestRunner().run(suite)

######################
这里看看TestCase类中有些什么设施。其中的设施有三类,一类是测试设施,一类是条件检测,一类是有关测试信息的方法。
1。测试设施:
setUp(),tearDown(),run(),debug()
2。条件测试:
def fail(self, msg=None):失败
def failIf(self, expr, msg=None):如果真则失败
def failUnless(self, expr, msg=None):如果假则失败
def failUnlessRaises(self, excClass, callableObj, *args, **kwargs):
def failUnlessEqual(self, first, second, msg=None):
def failIfEqual(self, first, second, msg=None):
def failUnlessAlmostEqual(self, first, second, places=7, msg=None):
def failIfAlmostEqual(self, first, second, places=7, msg=None):
assertEqual = assertEquals = failUnlessEqual
assertNotEqual = assertNotEquals = failIfEqual
assertAlmostEqual = assertAlmostEquals = failUnlessAlmostEqual
assertNotAlmostEqual = assertNotAlmostEquals = failIfAlmostEqual
assertRaises = failUnlessRaises
assert_ = assertTrue = failUnless
assertFalse = failIf
3。相关信息:
id()包括模块名和类名的字符串
countTestCases()返回1
defaultTestResult()返回一个result类
shortDescription()