Python--*之路(二)Unittest Framework

 

Python Unit Testing Framework ---Unittest Model  学习

Python 中的测试框架,也可称做PyUnit ,几乎就是JUnitPython 版本。支持setup and shutdown code for tests, 独立测试,集成测试,我使用的是python 2.6 ,内置的测试模块名为unittest 。可以通过from unittest import * 方法导入需要的功能模块 

继承python Unittest TestCase ,测试方法必须以test开头命名,单元测试时可使用派生使初始化测试代码的重用。

TestSuit,作为轻量级集成测试时使用。可以方便地添加基类型为Testcase的所有子类,统一测试。

widgetTestSuite=unittest.TestSuite() widgetTestSuite.addTest(WidgetTestCase('testDefaultSize')) widgetTestSuite.addTest(WidgetTestCase('testResize'))

单元测试的使用---导入unittest模块 unittest.main() 在被测试单元中实现至少一个TestCase派生,或者从TestLoader加载,例

suite =unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions) unittest.TextTestRunner(verbosity=2).run(suite) 

为了工作方便,在上述基础上写了一个测试模块test,当创建好自己的模块后,有时候需要进行模块的单元测试,这时候只要导入test, 然后在Tested Module代码后面直接调用函数测试,属性值测试,就可以直接测试了,测试结果集成了TestCaseResult,会给出具体的测试报告,自己觉得很方便而已,呵呵,后面有时间还想扩展一下针对类的测试,在函数测试上引入多线程等等。主要应用了Python运行时脚本编译的特性,根据被测试模块的内容动态生成字符串代码对象,经编译后就可以在程序中动态生成类以供调用。附test代码:

 

Python--*之路(二)Unittest FrameworkPython--*之路(二)Unittest FrameworkCode
'''
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()

 

上一篇:AJaxPro 与 DWR 的研究与比较


下一篇:Pyhton*之路(六)闭包与装饰器