我该如何测试/重构我的测试?
我有一个应用程序的测试套件。随着测试套件的不断增加,里面有很多重复的代码,这些代码可以进行优化。
不过,我想确保在优化代码的过程中,测试套件的功能不会发生变化。我该如何检查我的测试在优化后是否保持不变呢?
(我使用的是Python和UnitTest,不过我觉得这个问题的答案不一定和语言有关。)
8 个回答
这个问题很有意思——我总是喜欢听关于“我该如何测试我的测试?”这种讨论。@marksweb 提到的观点也很不错。
检查你的测试是否真的能达到预期效果,确实是个挑战,但把这件事做好是非常重要的。我总是记住一个经验法则,那就是在任何项目中,测试应该占到 开发工作量的三分之一……无论项目的时间限制、压力和不可避免的问题。
如果你打算继续发展你的项目,是否考虑过像你说的那样进行重构,但要以一种建立合适测试框架的方式来进行,这样可以支持未来功能的测试驱动开发(TDD)或项目的整体扩展呢?
Coverage.py 是一个很好的工具。
把你想要重构的所有测试移到“系统测试”这类标签下。你可以重构你想要的测试(这里你应该是在做单元测试吧?),然后监控代码覆盖率:
- 在运行新的单元测试之后,但在运行系统测试之前
- 在同时运行新的单元测试和系统测试之后。
理想情况下,代码覆盖率应该保持不变或者更高,这样你就可以放弃旧的系统测试了。
顺便提一下,py.test 提供了一个简单的方式来给测试打标签,并且可以只运行特定的测试,而且它和 unittest2 测试是兼容的。
测试的真正考验在于生产代码。
检查你的测试代码重构是否没有出错的一个有效方法是进行变异测试。这个方法是把你要测试的代码复制一份,然后故意引入一些错误,看看你的测试能否捕捉到这些错误。这是一些测试覆盖工具使用的策略。
我自己没有用过(而且我也不是特别擅长Python),但这个方法似乎得到了Python Mutant Tester的支持,所以可以考虑了解一下。