Java JUNIT - 使用String进行多次测试

时间:2017-01-05 13:59:18

标签: java unit-testing junit

我试图通过尊重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);

2 个答案:

答案 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") //
  );
 }
}

我认为,如果在测试中,则更好,更可读,因为你只有一个断言,起始值在测试时间内没有改变,参数很容易扩展和维护。