jUnit:通用测试类 - 将测试名称设置为除类/方法名称之外的其他内容?

时间:2012-10-18 02:42:21

标签: java testing junit automated-tests testng

我有一个项目测试套件 我想用作测试套件的一组文件 - 每个文件一次测试

但是测试的数量将达到数百个,每个测试都是相同的:解析文件并检查输出。维护每个文件的方法很繁琐。

JBoss Operation Network使用了TestNG,它允许创建一个测试套件,并将其填充到同一类的多个实例中,并允许显式设置测试名称

在jUnit中,我还没有找到更改测试名称的方法。所以对所有人来说都是一样的。

是否有某种方法或扩展可以使用自定义生成的测试名称多次运行同一个类?

PS:我不想诉诸课堂乐器。

2 个答案:

答案 0 :(得分:4)

创建TestSuite时,可以将desiredTestCaseName作为构造函数参数传递:

public class AllTestSuite extends TestSuite{

  public static Test suite() {
      TestSuite suite= new TestSuite();
      Test testCase1 = new MyTest("TestCaseOne");
      Test testCase2 = new MyTest("TestCaseTwo");
      suite.addTest(testCase1);
      suite.addTest(testCase2);
      return suite;
  }
}

运行套件时,它将引用构造函数中提供的名称,即TestCaseOneTestCaseTwo,而测试类为MyTest

修改

请确保您已将MyTest类中的构造函数定义为:

public MyTest(String name) {
    super(name);
}

如果需要额外的参数支持,您可以在Test case中添加一个构造函数来接受参数并将它们分配给测试用例类变量(最初默认使用默认测试场景值),这可以在测试执行期间使用:

public MyTest(String name, String param1, Integer param2...) {
    super(name);
    this.param1 = param1;
    this.param2 = param2;
}

运行测试套件后,JUnit Console如下图所示: enter image description here

答案 1 :(得分:3)

如果您使用的是JUnit4,可以查看@Parameterized。基本思想是提供要做的事情列表,JUnit对列表中的每个项目执行相同的测试方法。

对于版本4.10,命名不是太大,你得到0,1,2 ......作为名称,但是4.11-beta-1(它应该很快就会出现),你可以获得更好的命名方案,因为您可以指定名称。请参阅@Parameterized顶部的javadoc。

@RunWith(Parameterized.class)
public class FibonacciTest {
    @Parameters(name= "{index}: fib({0})={1}") // we specify the name here
    public static Iterable<Object[]> data() {
        return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
                { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
    }

    private int fInput;

    private int fExpected;

    public FibonacciTest(int input, int expected) {
        fInput= input;
        fExpected= expected;
    }

    @Test
    public void test() {
        assertEquals(fExpected, Fibonacci.compute(fInput));
    }
}

在上文中,您最终会得到诸如

之类的名称
fib(0)=0
fib(1)=1
fib(2)=1