我尝试通过尊重best practices来实现单元测试。规则之一是通过方法仅使用一个“断言”。我想通过方法实现几个测试,因为在每种方法的开始都进行了繁重的处理(插入数据库-> 5秒)。
我开发了此解决方案,这是一个好习惯吗?
String failuresMsg = "";
if(9 != var1)
failuresMsg += "[var1 <9," + var1+">]";
if(9 != var2)
failuresMsg += "[var2 <9," + var2+">]";
if(9 != var3)
failuresMsg += "[var3 <9," + var3+">]";
if(9 != var4)
failuresMsg += "[var4 <9," + var4+">]";
assertEquals("", failuresMsg);
最佳答案
规则之一是通过方法仅使用一个“断言”。
不,您不应该限制自己通过测试方法来测试场景。这不是同一回事。
String failuresMsg = "";
if(9 != var1)
failuresMsg += "[var1 <9," + var1+">]";
if(9 != var2)
failuresMsg += "[var2 <9," + var2+">]";
if(9 != var3)
failuresMsg += "[var3 <9," + var3+">]";
if(9 != var4)
failuresMsg += "[var4 <9," + var4+">]";
assertEquals("", failuresMsg);
通常,当您具有某个范围可接受的值时,至少应测试该范围的极限以及该范围的一个或多个内部值。
如果进行测试,它将给出两种测试方法(或者根据观察的方式更多),因为我有两种不同的情况:
该值是可以接受的
该值不可接受
对于每种情况,如果代码和测试的可维护性保持良好,我可以执行我需要的任何断言。
这是一个示例代码:
@Test
public void doMethodWithAcceptableValues(){
int testValue = 0;
Assert.assertTrue(objUnderTest.doMethod(testValue));
testValue = 100; // limit value
Assert.assertTrue(objUnderTest.doMethod(testValue));
testValue = 50; // middle value 50. it is an example
Assert.assertTrue(objUnderTest.doMethod(testValue));
}
@Test
public void doMethodWithNotAcceptableValues(){
int testValue = -1;
Assert.assertFalse("-1 not acceptable", objUnderTest.doMethod(testValue));
testValue = 101; // limit value
Assert.assertFalse("101 not acceptable", objUnderTest.doMethod(testValue));
}
如果间隔不是太重要,什么也不会阻止您测试间隔的所有值,可以使用JUnit机制(参数化测试)或创建自己的方法(例如,使用循环执行此逻辑)。
在许多情况下,家庭处理更加简单,可读和可维护。