将@Test方法动态添加到junit测试类

时间:2013-01-30 14:41:26

标签: junit junit4 junit3

我们有一个文本文件,其中给出了搜索查询列表和预期结果。如,

搜索结果

a:120         result1
b:220         result2
.....
.....

现在,我们需要编写一个JUnit(在我们的日常构建中大量使用)测试类,其中每行代表一个@Test method。因此,我们知道,哪个搜索案例失败(UI)。

我们已经有了一个解决方案,我们只有一个@Test方法,我们有日志来检查哪个案例通过或失败了。

但是,我们试图将每个案例表示为junit方法。是否真的可以为JUnit架构动态创建@Test方法。

我们的@Test方法对于每个搜索案例都是相同的。这意味着,我们只想每次都传递一个不同的参数。

我已经为我的问题提出了一个JUnit3解决方案。需要帮助才能将其翻译为Junit4。

public static Test suite()
   {
      TestSuite suite = new TestSuite();
      for ( int i = 1; i <= 5; i++ ) {

         final int j = i;
         suite.addTest(
            new Test1( "testQuery" + i ) {
               protected void runTest()
               {
                  try {
                     testQuery( j );
                  } catch ( MalformedURLException e ) {

                     // TODO Auto-generated catch block
                     e.printStackTrace();
                  } catch ( SolrServerException e ) {

                     // TODO Auto-generated catch block
                     e.printStackTrace();
                  }
               }
            }
            );
      }

      return suite;
   }

1 个答案:

答案 0 :(得分:3)

在JUnit 4中,有一个名为“参数化测试”的概念正是用于此。

我不完全理解你上面的测试,但这应该给你一个提示:

@RunWith(Parameterized.class)
public class ParameterizedTest {

    private String query;
    private String expectedResult;

    public ParameterizedTest(String query, String expectedResult) {
        this.query = datum;
        this.expectedResult = expectedResult;
    }

    @Parameters
    public static Collection<Object[]> generateData() {
        Object[][] data = {
                { "a:120", "result1" },
                { "b:220", "result2" },
        };
        return Arrays.asList(data);
    }

    @Test
    public void checkQueryResult() {
        System.out.println("Checking that the resutl for query " + query + " is " + expectedResult);
        // ...
    }

}