January 18, 2008
自动单元测试框架, PyUnit, tsqlunit, xUnit framework
Notes on Python自动单元测试框架 。
from widget import Widget
import unittest
class WidgetTestCase(unittest.TestCase): # 测试例(test case)
def setUp(self): # 测试前的初始化工作。
# 声明在unittest.TestCase中,自动调用。
self.widget = Widget()
def tearDown(self): # 测试后的清理工作。
self.widget = None
def testSize(self): # 自定义的测试方法。
self.assertEqual(self.widget.getSize(), (40, 40)) # assertEqual是TestCase提供的工具。
def testColor(self): # 一个测试例中可以定义多个测试方法函数。
# 默认的测试方法函数名为runTest
pass
def suite(): # 测试集(test suite)
suite = unittest.TestSuite() # 函数返回TestSuite的测试集实例。
suite.addTest(WidgetTestCase("testSize")) # 测试集中加入测试方法。
# 多个测试方法组成一个测试集。
# 可以用unittest.makeSuite批量添加测试方法。
return suite
if __name__ == "__main__":
unittest.main(defaultTest = 'suite') # 执行测试
# 也可自定义执行测试的Runner
# runner = unittest.TextTestRunner()
# runner.run(suite)
自动生成测试例,批量测试
借鉴JUnit框架上的一个方案,用程序生成一个足够大的测试集。Write a suite( ) method that iterates through all of your
input data, creating a unique instance of your test case for each
unique input. The data is passed to the test cases through the
constructor, which stores the data in instance fields so it is
available to the test methods.
A similar solution,
pyUnit and dynamic test functions .
如果像我这样需要一个测试集,可以自动的无穷尽的pop出各种各样的,甚至是随机的测试例,或者是测试例的参数,而不是预先在测试集中(内存中)建立好所有的测试例,可以利用TestSuite的Iterator的特性实现。
TestRunner中的run方法,对TestSuite来说,仅仅是调用了其test方法。
class TextTestRunner:
""" ... """
def run(self, test):
"Run the given test case or test suite."
result = self._makeResult()
startTime = time.time()
test(result)
stopTime = time.time()
timeTaken = stopTime - startTime
result.printErrors()
""" ... """
所以可以重载TestSuite类,生成支持Iterator的测试集,自动生成测试例。代码如下
import unittest
class TheTestCase(unittest.TestCase):
def __init__(self, n):
unittest.TestCase.__init__(self)
self.n = n
def runTest(self):
assert( self.n>3 )
class MyTestSuite(unittest.TestSuite):
def __init__(self):
unittest.TestSuite.__init__(self)
self.i = 0
self.N = 5
def __iter__(self):
return self
def next(self):
self.i += 1
if self.i > self.N: raise StopIteration
return TheTestCase(self.i)
def run(self, result):
for test in self:
if result.shouldStop:
break
test(result)
return result
def suite():
return MyTestSuite()
if __name__=='__main__':
unittest.main(defaultTest='suite')
xUnit Framework
结合这个tsqlunit框架 (不是很实用),可以粗略总结xUnit Framework构建的单元测试框架里的一些要点。
- 集中格式化输出显示(PRINT)测试结果及报告。
- 通过测试集、测试例组织管理测试代码,重用测试代码。
- 自动加载测试例。
- 统一测试例的接口(包括异常抛出),简化测试例编写。
Filed by
charlie
at 7:20 am under 