我试图通过尊重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);
答案 0 :(得分:3)
其中一条规则是只使用一个&#34;断言&#34;通过方法。
不,你应该限制自己通过测试方法测试场景。这不是一回事。
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机制(参数化测试)或创建你自己的方法,例如用循环执行这个逻辑。 /> 在许多情况下,家庭处理更简单,可读和可维护。
答案 1 :(得分:3)
我想,您可以在测试中使用JUnitParamsRunner
。如果使用此方法,则可以向test方法添加参数。然后,您可以从方法体中删除if。
示例:
@RunWith(JUnitParamsRunner.class)
public class TestSomething{
@Test
@Parameters({ "A", "B", "C" })
public void shouldDoSomething(String s){
assertEquals(s, "s");
}
//OR
@Test
@Parameters(method = "data")
public void shouldSomething(String a, String b){
assertEquals(a,b);
}
@SuppressWarnings("unused")
private Object[] data() {
return $( //
$("A", "B") //
);
}
}
我认为,如果在测试中,则更好,更可读,因为你只有一个断言,起始值在测试时间内没有改变,参数很容易扩展和维护。