作者:Andrew Trenk
原文链接:http://googletesting.blogspot.tw/2014/10/testing-on-toilet-writing-descriptive.html
你需要多久才能从下面的代码中了解什么行为正在被测试?
@Test public void isUserLockedOut_invalidLogin() {
authenticator.authenticate(username, invalidPassword);
assertFalse(authenticator.isUserLockedOut(username));
authenticator.authenticate(username, invalidPassword);
assertFalse(authenticator.isUserLockedOut(username));
authenticator.authenticate(username, invalidPassword);
assertTrue(authenticator.isUserLockedOut(username));
}
你可能要通读每一行代码(或许不止一次)才能清楚每一行代码是做什么的。但是用这样的测试命名,让你了解被测行为要花多久?
isUserLockedOut_lockOutUserAfterThreeInvalidLoginAttempts
现在通过新的测试名称你应该就能很好的理解被测行为是什么,而且你甚至不用再去通读每一行的测试代码。上面的那个测试名的例子描述了一个测试场景(无效登录),但实际上它没有说明测试的预期结果是什么,因此你还是得通读一遍代码。
测试名称包含场景和预期结果还有很多好处:
-相比花上几分钟甚至几个小时去研读代码或者测试类,你只需通过测试名称就可以了解一个类中所有的测试行为。这一点在代码审查时,可以很快速地验证测试代码是否覆盖了所有预期的用例。
-通过给测试更清晰明确的命名,督促你为不同的行为设计独立的测试。否则你可能就会把不同行为添加到一个测试里来为它们添加断言,从长期来看,测试代码持续增长并且变得难以理解和维护。
-从测试代码来看某一测试行为可能并不总是那么清晰。如果这时候测试名称也不明确,那你可能要去猜这个测试到底要测什么。
-你可以很容易的判断哪些功能没有被测试到。如果你没有从测试名称中找到你要找的测试行为描述,那么明显它还不存在。
- 当一个测试失败时,你可以不用查看测试源代码就能迅速地定位哪一个功能出错了。
有很多组织测试名称的通用样式(有一个例子是在测试命名时在名称中添加"should",如:shouldLockOutUserAfterThreeInvalidLoginAttempts)。不论你选用什么样式,都建议你:确保测试名称包含测试场景和预期结果。
有时候,在测试中指定一个方法名就足够了,特别是函数方法简单的,那么通过名字就可以明显知道测试的行为。