JUnit如何在XML报告文件中保存DisplayName

时间:2018-08-15 12:56:51

标签: java junit appium

我想生成带有已执行测试信息的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。有人可以帮我按我想要的方式显示/保存它吗?

1 个答案:

答案 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!