junit测试用例的问题!避免代码重复

时间:2011-11-11 11:45:38

标签: java junit

我正在编写用于测试API的jnuit测试用例。

我的课程如下

class MyTest extends TestCase{
    List<String>  argList;
    public MyTest(){
     //read argList from File
    }



     testMyTest(){
       //callmy api
         myApi(arg1);
       }

}

现在我想为50个args中的每个args创建一个单独的测试用例。从File中读取Args。我不想写一个单独的方法用不同的args调用myApi。我怎么能这样做? 我不想写像

这样的sperate方法
testMyTest1(){
   //callmy api
     myApi(arg1);
   }

testMyTest1(){
   //callmy api
     myApi(arg2);
   }

4 个答案:

答案 0 :(得分:2)

您可以使用parameterized test

答案 1 :(得分:1)

private static final String[] args = new String[] {.....};

@Test
public void myTest(){
   for (int i=0; i<args.length; i++){
      myApi(args[i];
   }
}

以上回答了我的问题,但是JUnit的做法并不好。最好每个测试方法仅使用一个测试条件调用一次测试方法。这样,如果出现多个错误,每个错误都会产生一个单独的错误,而不是一次只处理一个错误。这表明如下:

private static final String[] args = new String[] {.....};

private void testMyTest(String arg){
    myApi(arg);
}

@Test
public void myTest0(){
  testMyTest(args[0]);
}
@Test
public void myTest1(){
  testMyTest(args[1]);
}

可能最好的机制是执行上面的第一个选项,但使用ErrorCollector规则允许报告多个错误。

编辑我坚持认为,jordao关于参数化测试的答案确实是最好的方法。

答案 2 :(得分:1)

您可以使用参数化测试或理论(自JUnit 4.4起)。有关详细信息,请使用

答案 3 :(得分:0)

单元测试通常使用断言进行。您不需要为每个参数编写方法,而是根据您的参数执行不同的断言。

这样做的一种方法是:

class MyApiTest extends TestCase {
    List<String>  argList;

    public MyApiTest() {}

    public testMyApi() {
        assertTrue(testMyApi(arg1));
        assertFalse(testMyApi(arg2));
        assertNull(testMyApi(arg3));
        assertEquals(testMyApi(arg4), testMyApi(arg5));
    }
}

我甚至更喜欢使用注释,比如

class MyApiTest {
    @Before
    public setUp() {}

    @After
    public tearDOwn() {}

    @Test
    public testMyApi() {
        Assert.assertTrue(testMyApi(arg1));
        Assert.assertFalse(testMyApi(arg2));
        Assert.assertNull(testMyApi(arg3));
        Assert.assertEquals(testMyApi(arg4), testMyApi(arg5));
    }
}