作者:Rich Martin
原文链接:http://googletesting.blogspot.tw/2014/05/testing-on-toilet-effective-testing.html
无论我们是在写一个独立的单元测试,还是在设计一个产品的整个测试过程,重要的是退一步思考 – 我们的测试能多有效地检测、报告代码中的错误。为了保证测试的有效性,每个测试需要最大限度地具备以下三个重要特性:
覆盖度
当被测代码运行出错时,测试就失败了。高覆盖度的测试,是对被测代码中的缺陷非常敏感的,这有助于避免代码中处处都是BUG。
保证你的测试能够走遍代码中的所有路径,并包含所有预期状态的相关断言,以达到最大限度的覆盖。
应变性
如果被测代码没有缺陷,测试也不应该失败。可应变的测试,是只有在被测代码发生重大变更时才会失败的测试。被测代码进行重构或其他小变更时,不需要修改测试,这样一来就降低了维护测试的成本。
仅仅测试被测代码公开的接口,避免涉及到内部,从而做到最大程度的应变。最好使用基于mock的桩和模拟;不要修改具有依赖性的交互,除非那是你明确验证过的交互。一个薄弱的测试显然是应变性很低的。
精确度
当测试失败时,高精确度的测试会准确地定位缺陷。一个编写良好的单元测试会准确地告诉你哪一行代码存在错误。编写不良的测试(特别是大型的端到端测试),时常表现出非常低的精确度,只告诉你有错误,而不知道具体在哪。
通过保持你的测试规模小且关注点高度集中,来达到最大化的精确度。选择描述性的方法名称,明确表达该测试进行验证的目的。对于系统测试,则需要验证每一个边界状态。
这三者往往是互相紧密联系的。编写高应变性的测试(例如,对空内容的测试)是容易的,但是编写一个兼具应变性和覆盖度的测试,是很难的。 当你设计和编写测试的时候,将这些特性视为框架来指导具体的实现。