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