有没有开源工具可以自动生成遗留代码的测试用例?
我最近看到了一篇旧文章:
http://imranontech.com/2007/01/04/unit-testing-the-final-frontier-legacy-code/
文章中提到,作者写了一个perl脚本,用来自动生成测试用例。具体的做法是这样的:
- 先读取我给它的头文件。
- 提取出函数的原型。
- 给我列出它找到的函数,让我选择想要为哪些函数创建单元测试。
然后,它创建了一个dbx(Solaris调试器)脚本,每次调用选定的函数时就会设置一个断点,保存传入的变量,然后继续执行,直到函数返回,这时它会保存返回值。
在dbx脚本下运行可执行文件,这时我就可以像平常一样使用应用程序,尽量多地测试我认为会经过相关代码的用例,特别是那些我觉得会触及边界情况的函数。
perl脚本会收集所有的示例运行,去掉重复的,然后自动生成一个C文件,里面包含每个示例的单元测试(也就是说,输入数据并验证返回值是否和示例运行的一样)。最后编译、链接并运行这些单元测试,丢弃那些失败的测试(也就是去掉那些导致函数表现不确定的输入)。
我有很多遗留代码,都是用Python和Fortran写的。这篇文章是2007年的。现在有没有类似的东西在单元测试框架中实现?
我该如何编写这样的脚本呢?
1 个回答
这段内容听起来很像C语言的东西。而且可能跟操作系统有关,我想(比如Solaris调试器)。我建议你可以看看“录制/捕捉和回放”工具,不过我觉得“生成”这一部分似乎没有得到广泛应用。
Python的测试工具分类是个不错的起点。你可以用Selenium录制你在应用程序中的操作,或者用Dogtail。这个链接直接带你到网页测试工具的部分,但你也可以看看其他的:模糊测试是一种类似于黄金大师的技术,有时可以帮助处理旧的应用程序,也是“录制/回放”的一种方法。Feathers把这种测试称为“特征化”测试,因为它们描述了旧系统的行为。
你引用的文章中有个很好的观点:
看看你自己的源代码库,看看哪些函数/类修复了最多的bug,通常80%的bug修复集中在20%的代码上。这是有道理的——通常那20%的代码写得很糟糕,里面有很多“特殊情况”的小技巧。
这就是我会开始的地方。你找到了这些部分吗?简单的Git/SVB日志使用脚本和分类中的覆盖工具会对你有帮助。
不幸的是,我能帮的也就这些了——我的Python经验有限,而Fortran就更没有了。