在JUnit4中使用参数化测试时,是否有一种方法可以设置我自己的自定义测试用例名称?
我想改变默认的-[测试类]. runtest [n] -有意义的东西。
在JUnit4中使用参数化测试时,是否有一种方法可以设置我自己的自定义测试用例名称?
我想改变默认的-[测试类]. runtest [n] -有意义的东西。
当前回答
对于一个更复杂的对象,您可以执行以下操作(以JUnit 4为例):
@RunWith(Parameterized.class)
public class MainTest {
private static Object[] makeSample(String[] array, int expectedLength) {
return new Object[]{array, expectedLength, Arrays.toString(array)};
}
@Parameterized.Parameters(name = "for input {2} length should equal {1}")
public static Collection<Object[]> data() {
return Arrays.asList(
makeSample(new String[]{"a"}, 1),
makeSample(new String[]{"a", "b"}, 2)
);
}
private final int expectedLength;
private final String[] array;
public MainTest(String[] array, int expectedLength, String strArray) {
this.array = array;
this.expectedLength = expectedLength;
}
@Test
public void should_have_expected_length() {
assertEquals(expectedLength, array.length);
}
}
这里的技巧是使用一个输入参数作为字符串来描述输入的某些部分或整个测试用例。
在添加第三个参数之前,它是这样的
然后像这样
其他回答
我大量使用静态导入的Assert和朋友,所以我很容易重新定义断言:
private <T> void assertThat(final T actual, final Matcher<T> expected) {
Assert.assertThat(editThisToDisplaySomethingForYourDatum, actual, expected);
}
例如,您可以向您的测试类添加一个“name”字段,在构造函数中初始化,并在测试失败时显示它。只需将它作为每个测试参数数组的第一个元素传递进来。这也有助于标记数据:
public ExampleTest(final String testLabel, final int one, final int two) {
this.testLabel = testLabel;
// ...
}
@Parameters
public static Collection<Object[]> data() {
return asList(new Object[][]{
{"first test", 3, 4},
{"second test", 5, 6}
});
}
在junit4.8.2中,您可以通过简单地复制Parameterized class来创建自己的MyParameterized类。更改TestClassRunnerForParameters中的getName()和testName()方法。
参数化测试在内部调用toString()。 如果您创建覆盖toString()的对象包装器,它将改变测试的名称。
这里有一个例子,我在其他帖子中回答过。 https://stackoverflow.com/a/67023556/1839360
您可能还想尝试JUnitParams: https://github.com/Pragmatists/JUnitParams
这个特性已经加入到JUnit 4.11中。
若要使用更改参数化测试的名称,请执行以下命令:
@Parameters(name="namestring")
Namestring是一个字符串,可以有以下特殊占位符:
{index} -这组参数的索引。默认名称字符串是{index}。 {0} -测试调用的第一个参数值。 {1} -第二个参数值 等等
测试的最终名称将是测试方法的名称,后面跟着括号中的名称字符串,如下所示。
例如(改编自Parameterized注释的单元测试):
@RunWith(Parameterized.class)
static public class FibonacciTest {
@Parameters( name = "{index}: fib({0})={1}" )
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 final int fInput;
private final int fExpected;
public FibonacciTest(int input, int expected) {
fInput= input;
fExpected= expected;
}
@Test
public void testFib() {
assertEquals(fExpected, fib(fInput));
}
private int fib(int x) {
// TODO: actually calculate Fibonacci numbers
return 0;
}
}
将给出像testFib[1: fib(1)=1]和testFib[4: fib(4)=3]这样的名称。(名称的testFib部分是@Test的方法名)。