我想生成带有已执行测试信息的XML报告文件。以前我在JUnit4中使用下面的@Rule
所示,但现在我想显示注释或简短描述的一部分,而不是testName。经过一番研究,我发现JUnit5中的@DisplayName
似乎很适合我的需求。现在,我必须更新@Rule
才能显示@DisplayName
的内容,而不是testName[number].className
。
测试是用JUnit类编写的,具有以下结构
@Test
@DisplayName("This text should be displayed as name")
public void testy1() {...}
为了显示运行测试的结果和名称,我使用以下方案创建了新规则
@Rule
public TestRule watchman = new TestWatcher() {
@Override
public Statement apply(Statement base, Description description) {
return super.apply(base, description);
}
@Override
protected void succeeded(Description description) {
try {
junitWriter.write("\n <test>"
+ "\n <name>" + description.getDisplayName() + "</name>"
+ "\n <result>..
+ "\n <message>..
+ "\n </test>");
} catch [..]
}
@Override
protected void failed(Throwable e, Description description) {
//same scheme with error
}
}
我要开始测试
Result result = JUnitCore.runClasses(mainSuiteClassCreatingReport);
System.out.printf("Test ran: %s, Failed: %s%n", result.getRunCount(), result.getFailureCount());
在生成的XML文件而不是“ DisplayName”注释中,我不断得到methodName[number].className
。有人可以帮我按我想要的方式显示/保存它吗?
答案 0 :(得分:0)
您不能在JUnit 4中使用@DisplayName
。
如果要使用@DisplayName
,则需要切换到JUnit Jupiter(又称JUnit 5)并实现Extension
。
请注意,JUnit Jupiter尚不支持扩展API,例如JUnit 4中的TestWatcher
规则。但是,JUnit 5.4中提供了这种支持:https://github.com/junit-team/junit5/issues/542
要自定义JUnit 4中getDisplayName()
中Description
返回的内容,您需要编写自己的自定义Runner
。或者,您可以简单地解析从getDisplayName()
返回的值,并使用该值生成您自己的显示名称。
或者,如果要使用JUnit 4支持自己的自定义显示名称注释,例如:
package foo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyDisplayName {
String value();
}
您可以使用这样的反射在TestWatcher
实现中查找它:
package foo;
import java.lang.reflect.Method;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
public class ExampleTests {
@Rule
public TestRule watchman = new TestWatcher() {
@Override
protected void succeeded(Description description) {
System.out.println("Display name: " + getDisplayName(description));
}
private String getDisplayName(Description description) {
Class<?> testClass = description.getTestClass();
String methodName = description.getMethodName();
try {
Method method = testClass.getDeclaredMethod(methodName);
MyDisplayName myDisplayName = method.getAnnotation(MyDisplayName.class);
return myDisplayName.value();
}
catch (Exception ex) {
// do something with the exception if you want...
}
// default:
return testClass.getName() + "." + methodName + "()";
}
};
@Test
public void testWithoutCustomDisplayName() {
}
@Test
@MyDisplayName("Custom display name!")
public void testWithCustomDisplayName() {
}
}
运行该测试类将输出以下内容:
Display name: foo.ExampleTests.testWithoutCustomDisplayName()
Display name: Custom display name!