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()