我想知道测试只检查布尔表达式的方法的最佳方法是什么。
例如,我想测试这个方法:
boolean canDoSomething( Account account, User user )
{
return ( account.isAck()
&& account.getEmail() != null
&& account.getName().equals( user.getProvider() );
}
我是否必须为每个布尔组合编写junit方法?与whenNotAckThenDontDoSomething()
,whenEmailIsNullThenDontDoSomethind()
...
我认为这有点难看所以我想知道是否有更好的方法来做到这一点。
答案 0 :(得分:3)
一如既往地进行测试直到恐惧变成无聊。也许你不需要所有八种可能的组合 - 也许尝试四种:一种方法都有效,然后在每种其他测试中使一种条件为假。
有些人会因为这样说而焚烧我,但你可能会将其表达为一个积极的测试和一个消极的测试:
public void testCanDoSomething_allValid() {
assert.isTrue(foo.canDoSomething(new Account(true, "x@y.z", "Fred"),
new User("Fred")));
}
public void testCanDoSomething_negative() {
assert.isFalse(foo.canDoSomething(new Account(false, "x@y.z", "Fred"),
new User("Fred")));
assert.isFalse(foo.canDoSomething(new Account(true, null, "Fred"),
new User("Fred")));
assert.isFalse(foo.canDoSomething(new Account(true, "x@y.z", "Ginger"),
new User("Fred")));
}
虽然肯定有“只在每个测试中测试一条路径”的论据,但我发现像这样分组非常简单的测试有时会导致更简单的测试可读性。当然,当你的测试开始做任何更复杂的事情时,你应该将它们分解出来。
(还有一些可能性,例如user
或account
为null,或者您可能需要考虑的用户名为null等。)
答案 1 :(得分:2)
完全测试方法意味着测试表达式中的每个布尔组合。您可能并不总是需要这样:测试,直到您确信所有可能的故障选项都已涵盖。
您应该至少测试每个条件是否为false,而其他条件为true,以验证只有满足所有条件时返回值为true。即。