技术开发 频道

测试遗留代码

    通过代码结构进行测试

    当您已经测试了应用程序的基本功能,考虑代码中的替代路径就变得非常重要了。在大多数语言中,您可以按照下面的步骤分解您的测试:
    为每个程序包或者模板编写一个测试。
    当每个程序包都有了至少一个测试,再为每一个类编写一个测试。
    当每个类都有了至少一个测试,再为每一个方法编写一个测试。
    当每个方法都有了至少一个测试,使用一个代码覆盖率工具如Cobertura为每个分支编写一个测试,直到每一行代码都能够被测试。
    您也可以在第4步之前使用一个代码覆盖率工具,但是我宁愿您手动完成前面的步骤。虽然很多类、程序包和方法都可以通过功能测试进行测试,但是当您从一个程序员的角度而不是从一个用户的角度查看程序时,经常会发现不同的问题。
    实际上,在很多情况下,您从来都不会接触到第4步。您完全没有时间或者预算来编写每个可能的测试。这样也可以,因为做一些测试和不作测试的区别比做所有的测试和做一些测试的区别更大更重要。

    自动测试

    可以使用反射生成一个测试骨架。这样能够更容易找到您需要测试的所有公有方法。每个测试都像这样开始:

public void testMethodName() { fail("Test Code Not Written Yet"); }

    这种方法不好的一面是会立刻得到成百上千个失败的测试。一个可供选择的方法是在每个测试中添加一个TODO注释而不是完全失败。然后当时间允许时,您再检查并补充这些测试。

 

public void testMethodName() { // TODO fill in test code }

    如果您使用的是JUnit 4,您能够简单地将测试注释为@Ignore,直到您将它们填写完,例如:

@Ignore public void testMethodName() { // TODO fill in test code }

     在这种情况下,运行测试提醒您它虽然跳过了测试,但是它不会使您失望。实际上,它给您评为Pass-Fail-Incomplete。
您能够找到很多可以为您自动编写测试的工具。然而,这些工具生成的测试往往相当琐碎和基本,例如方法是否能够处理传递来的null参数。这种工具不能真正了解每个类和方法应有的功能。所以,您需要人类的智能。

0
相关文章