l Python Unit Testing Framework ---Unittest Model 学习
l Python 中的测试框架,也可称做PyUnit ,几乎就是JUnit的Python 版本。支持setup and shutdown code for tests, 独立测试,集成测试,我使用的是python 2.6 ,内置的测试模块名为unittest 。可以通过from unittest import * 方法导入需要的功能模块
l 继承python Unittest TestCase 类,测试方法必须以test开头命名,单元测试时可使用派生使初始化测试代码的重用。
l TestSuit,作为轻量级集成测试时使用。可以方便地添加基类型为Testcase的所有子类,统一测试。
l widgetTestSuite=unittest.TestSuite() widgetTestSuite.addTest(WidgetTestCase('testDefaultSize')) widgetTestSuite.addTest(WidgetTestCase('testResize'))
l 单元测试的使用---导入unittest模块 unittest.main() 在被测试单元中实现至少一个TestCase派生,或者从TestLoader加载,例:
l suite =unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions) unittest.TextTestRunner(verbosity=2).run(suite)
l 为了工作方便,在上述基础上写了一个测试模块test,当创建好自己的模块后,有时候需要进行模块的单元测试,这时候只要导入test, 然后在Tested Module代码后面直接调用函数测试,属性值测试,就可以直接测试了,测试结果集成了TestCaseResult,会给出具体的测试报告,自己觉得很方便而已,呵呵,后面有时间还想扩展一下针对类的测试,在函数测试上引入多线程等等。主要应用了Python运行时脚本编译的特性,根据被测试模块的内容动态生成字符串代码对象,经编译后就可以在程序中动态生成类以供调用。附test代码:
Code
'''
Created on 2009-7-18
@author: ysisl
This is a unit test framework module .
you can test your Module only by imported test.py
1. use addTestAttrs(attr_name,value) ,add the testing variable(attr_name) of your module (value is anticipant)
2. use adddTestMethods(func,args,result=None) ,add the testing Function of your module
(args must be tuple type,example:'args=(3,4)')
'''
from time import ctime
import unittest
__all__=['allTestAttrs','allTestMethods','startModuleTest']
_model_funcs=[]
_model_attrs=[]
def addTestAttrs(_attr_name,value):
_model_attrs.append((_attr_name,value))
def addTestMethods(func,args,result=None):
_model_funcs.append((func,args,result))
def makecode():
_head_code='''
class TestModule(unittest.TestCase):
def a(self):
print 'aaa'
'''
_loop_func=_loop_attr=''
for i,attr in enumerate(_model_attrs):
_attr,_attr_value=attr[0],attr[1]
if type(_attr)==str :
_attr=repr(_attr)
_attr_value=repr(_attr_value)
_loop_attr_code='''
def test_attr_%s(self):
self.assertEqual(%s,%s)
''' %(str(i+1),_attr ,_attr_value)
_loop_attr=_loop_attr+_loop_attr_code
for i,func in enumerate(_model_funcs):
_func_result=str(func[2])
if type(func[2])==str:
_func_result=repr(func[2])
_loop_func_code='''
def test_method_%s(self):
self.assertEqual(%s(*%s),%s)
''' %(func[0].__name__,'_model_funcs['+str(i)+'][0]',str(func[1]),_func_result)
_loop_func+=_loop_func_code
return _head_code+_loop_attr+_loop_func
def startModuleTest():
print ''.join(['*'*13,' '*2,'Model Unit Test at:',ctime(),' '*2,'*'*13,'\n'])
code= makecode()
exec code
suite = unittest.TestLoader().loadTestsFromTestCase(TestModule)
unittest.TextTestRunner(verbosity=2).run(suite)
if __name__ == '__main__':
addTestMethods(addTestAttrs, ('test','test'),None)
startModuleTest()