作者:Andrew Trenk
原文链接:
http://googletesting.blogspot.tw/2014/03/testing-on-toilet-what-makes-good-test.html
单元测试是验证我们的代码是否正确的重要工具,但是编写一个好的测试不仅仅是为了验证正确性--- 一个好的单元测试应该体现其他更多的特性来确保可读性和可维护性。
一个好的测试的特性就是清晰。清晰意味着:测试代码是能够作为人类可读的文档,并根据他们的公共API来描述被测试的代码。测试不能直接参考这些来实现细节。类的名字的必须说明这个类实现的所有方法。测试人员自己必须提供怎么使用这些类的例子。
还有两个更重要的属性就是完整性和简洁。当一个测试包含了所有你需要了解的信息,这个测试是完整的,当它不包含其他不重要的信息就是简洁。这种测试代码在两种计数上有缺失:
@Testpublic void shouldPerformAddition() {
Calculator calculator = newCalculator(new RoundingStrategy(),
"unused", ENABLE_COSIN_FEATURE, 0.01, calculusEngine, false);
intresult = calculator.doComputation(makeTestComputation());
assertEquals(5, result); //这个数字是从哪里来的?
}
大量分散的信息被传递到构造函数中,重要的部分被隐藏在一个辅助的方法里。这个测试代码可以通过澄清helper方法的目的来变得更加完整,也可以通过使用其他的helper来隐藏构造计算器时不相干的细节来达到简洁的目的:
@Test publicvoidshouldPerformAddition() {
Calculator calculator = newCalculator();
intresult = calculator.doComputation(makeAdditionComputation(2, 3));
assertEquals(5, result);
}
一个好的测试的最后一种属性就是弹性。之前写过,除非被测试的类的目的和状态改变了,否则一个弹性测试不需要被改变。添加新的方法仅仅需要添加新的测试代码,无需改变原来的代码。原始的测试不是弹性的基于你必须更新它(可能几十个其他测试!)不管你是否添加新的构造函数的参数。将这个细节移到辅助方法中会解决这个问题。