25、为测试失败做好准备
考虑下面的这个例子:
Handle handle = manager.getHandle(); assertNotNull(handle); String handleName = handle.getName(); assertEquals(handleName, "handle-01"); |
如果第一个断言失败, 紧接其后的语句会导致代码崩溃, 剩下的测试都将不被执行。 任何时候都要为测试失败做好准备, 避免单个失败的测试项中断整个测试套件的执行。 上面的例子可以重写成:
Handle handle = manager.getHandle(); assertNotNull(handle); if (handle == null) return; String handleName = handle.getName(); assertEquals(handleName, "handle-01"); |
26、写测试用例重现 bug
每上报一个 bug, 都要写一个测试用例来重现这个 bug (即无法通过测试), 并用它作为成功修正代码的标准。
27、了解局限
单元测试永远无法证明代码的正确性
一个跑失败的测试可能表明代码有错误, 但一个跑成功的测试什么也证明不了。
单元测试最有效的应用场合是验证和, 以及 回归测试: 当新功能增加和代码进行重构的同时,会不会影响到旧功能的正确性。
参考资料
[1] 维基百科关于单元测试的定义: Unit Testing
[2] 白盒和黑盒测试的简短描述: What is black box/white box testing?
[3] 我们最常用的 C++ 单元测试框架: CxxTest
[4] 我们最常用的 Java 单元测试框架: TestNG
[6] 我们最常用的 C++ 覆盖率分析工具: LCOV
[7] 我们最常用的 Java 覆盖率分析工具: Cobertura
[8] 更多关于不允许访问外部资源观点: A Set of Unit Testing Rules
[9] 来自 Apple 的单元测试建议: Unit Test Guidelines
[10] JUnit 最佳实践: JUnit best practices
相关链接: