近期尝试了一下TDD(測试驱动)的模式。感觉效果不错。在此总结一下,同学们假设有更好的办法,一定要告诉我:)
1. 每一个功能模块(文件),配一个单元測试模块。
以手头这个项目为样例:有LogCat.py, LogModel.py, SceneBuilder.py 三个模块,那么就对应的新建LogCatTest.py, LogModelTest,SceneBuilderTest.py三个文件
2. 每一个函数都对应写一个单元測试例。
比方:在LogCat.py里有三个函数:
def parseDate(l): p = "(?P<date>[0-9]+-[0-9]+) " match = re.search(p, l) s = '' if( match is not None): s = match.group('date') return s def parsePath(l): p = " (?P<path>(\S\S+\/)+\S+)" match = re.search(p, l) path = '' if( match is not None): path = match.group('path') if path.startswith("assets") is False: path = "assets/" + path return path
def parseTime(l): p = " (?
P<time>[0-9]+:[0-9]+:[0-9]+.[0-9]+) "
match = re.search(p, l) t = None if( match is not None): s = match.group('time') t = datetime.datetime.strptime(s, '%H:%M:%S.%f') return t 这几个函数是通过正則表達式解析一行日志中对应变量的。在LogCatTest.py里。写上对应的測试例:
#LogCatTest.py from LogCat import *logs = []
logs.append( '09-01 14:36:10.139 E/cocos2d-x debug info(23244): File loaded(4157 bytes): assets/UI/alpha/HVGA/card/card_turn_2.pvr.ccz')
logs.append( '09-04 15:41:26.895 D/Cocos2d-x debug(16852): File loaded: assets/lang/data/video.txt.dream')
logs.append( '09-04 15:41:26.895 D/Cocos2d-x debug(16852): File loaded: lang/data/video.start.mp3')
logs.append( '09-04 15:41:26.895 D/Cocos2d-x debug(16852): File loaded: assets/version.txt')
def unit_test_parseDate(): for l in logs: print parseDate(l) def unit_test_parseTime(): for l in logs: print parseTime(l) def unit_test_parsePath(): for l in logs: print parsePath(l)
当然,这三个測试例測试的功能类似。能够整成一个。在这里仅仅是举个样例。
3. 在測试模块中,加入main函数, 其功能是通过命令行參数动态载入測试例:
#LogCatTest.py import traceback def main():func = sys.argv[1]unittest = "unit_test_" + funcglobals()[unittest]() if __name__ == "__main__": try: main() except Exception as e: traceback.print_exc() sys.exit(1)
3. 在命令行执行:
python LogCatTest.py parsePath,就能够执行对应的測试例了。
这里要注意一个问题。 假设測试例也要从命令行读取參数,须要从sys.argv[2]開始,由于sys.argv[1]作为測试例的名字被占用了。