最近尝试了一下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_" + func
globals()[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]作为测试例的名字被占用了。