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

向junit测试类动态添加@Test方法,junit,junit4,junit3,Junit,Junit4,Junit3,我们有一个文本文件,其中列出了搜索查询和预期结果。比如, 搜索结果 现在,我们需要编写一个JUnit(在日常构建中大量使用)测试类,其中每一行将代表一个@test方法。因此,我们知道哪个搜索案例失败(UI) 我们已经有了一个解决方案,其中我们只有一个@Test方法,我们有日志来检查哪个案例通过或失败 但是,我们正试图实现以junit方法表示的每个案例。真的有可能为JUnit体系结构动态创建@Test方法吗 我们的,@测试方法对于每个搜索案例都是相同的。这意味着,我们每次只想传递一个不同的参数 我

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

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

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

但是,我们正试图实现以junit方法表示的每个案例。真的有可能为JUnit体系结构动态创建@Test方法吗

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

我想出了一个解决问题的办法。需要帮助才能将其翻译成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;
   }
公共静态测试套件()
{
TestSuite=新的TestSuite();

对于JUnit4中的(inti=1;i),有一个称为“参数化测试”的概念正是用于此目的的

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

@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);
        // ...
    }

}
@RunWith(参数化的.class)
公共类参数化测试{
私有字符串查询;
私有字符串expectedResult;
公共参数化测试(字符串查询、字符串expectedResult){
this.query=数据;
this.expectedResult=expectedResult;
}
@参数
公共静态集合generateData(){
对象[][]数据={
{“a:120”,“result1”},
{“b:220”,“result2”},
};
返回数组.asList(数据);
}
@试验
公共无效检查查询结果(){
System.out.println(“检查查询“+query+”的结果是否为“+expectedResult”);
// ...
}
}

在JUnit4中,有一个称为“参数化测试”的概念正是用于此目的的

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

@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);
        // ...
    }

}
@RunWith(参数化的.class)
公共类参数化测试{
私有字符串查询;
私有字符串expectedResult;
公共参数化测试(字符串查询、字符串expectedResult){
this.query=数据;
this.expectedResult=expectedResult;
}
@参数
公共静态集合generateData(){
对象[][]数据={
{“a:120”,“result1”},
{“b:220”,“result2”},
};
返回数组.asList(数据);
}
@试验
公共无效检查查询结果(){
System.out.println(“检查查询“+query+”的结果是否为“+expectedResult”);
// ...
}
}

谢谢,这正是我所需要的。我的工作完成了。我们是否可以命名这些测试,类似于我的Junit3示例?即testQuery1、testQuery2等。@kma,是的,看看4.11版,您可以使用“{0}”将参数注释中的名称指定为数据的函数对于数组中的第一个对象,等等。谢谢,这正是我所需要的。我的工作完成了。我们是否可以命名测试,类似于我的Junit3示例?即testQuery1、testQuery2等。@kma,是的,看看4.11版,您可以使用“{0}”在参数注释中指定名称作为数据的函数对于数组中的第一个对象,等等。