繁体   English   中英

JUnit5 - 如何在 AfterTestExecutionCallback 中获取测试结果

[英]JUnit5 - How to get test result in AfterTestExecutionCallback

我写 JUnit5 扩展。 但是我找不到如何获得测试结果的方法。

扩展看起来像这样:

import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
import org.junit.jupiter.api.extension.TestExtensionContext;

public class TestResultExtension implements AfterTestExecutionCallback {
    @Override
    public void afterTestExecution(TestExtensionContext context) throws Exception {
        //How to get test result? SUCCESS/FAILED
    }
}

任何提示如何获得测试结果?

正如其他答案所指出的, JUnit通过异常传递失败的测试 ,因此可以使用AfterTestExecutionCallback 来发现发生的事情 请注意,这很容易出错,因为稍后运行的扩展程序可能仍然无法通过测试

另一种方法是注册自定义TestExecutionListener 不过,这两种方法都有点迂回曲折。 有一个问题跟踪特定的扩展点以对测试结果做出反应 ,这可能是您问题的最直接的答案。 如果你能提供一个特定的用例,如果你可以转到#542并留下描述它的评论,那就太棒了。

这项工作对我来说:

public class RunnerExtension implements AfterTestExecutionCallback {

    @Override
    public void afterTestExecution(ExtensionContext context) throws Exception {
        Boolean testResult = context.getExecutionException().isPresent();
        System.out.println(testResult); //false - SUCCESS, true - FAILED
    }
}

@ExtendWith(RunnerExtension.class)
public abstract class Tests {

}

我只有这个解决方案:

String testResult = context.getTestException().isPresent() ? "FAILED" : "OK";

它似乎运作良好。 但我不确定它是否能在所有情况下正常工作。

您可以使用org.junit.platform.launcher.listeners SummaryGeneratingListener

它包含MutableTestExecutionSummary字段,它实现了TestExecutionSummary接口,这样你就可以获得有关容器,测试,时间,故障等的信息。

您可以创建自定义侦听器,例如:

  1. 创建扩展SummaryGeneratingListener
 public class ResultAnalyzer extends SummaryGeneratingListener { @Override public void testPlanExecutionFinished(TestPlan testPlan) { //This method is invoked after all tests in all containers is finished super.testPlanExecutionFinished(testPlan); analyzeResult(); } private void analyzeResult() { var summary = getSummary(); var failures = summary.getFailures(); //Do something } } 
  1. 通过创建文件注册监听器

SRC \\主\\资源\\ META-INF \\ SERVICES \\ org.junit.platform.launcher.TestExecutionListener

并在其中指定您的实现

path.to.class.ResultAnalyzer

  1. 启用扩展的自动检测,设置参数

-Djunit.jupiter.extensions.autodetection.enabled =真

就是这样!

文件

https://junit.org/junit5/docs/5.0.0/api/org/junit/platform/launcher/listeners/SummaryGeneratingListener.html

https://junit.org/junit5/docs/5.0.0/api/org/junit/platform/launcher/listeners/TestExecutionSummary.html

https://junit.org/junit5/docs/current/user-guide/#extensions-registration-automatic

JUnit中的失败会传播异常。 有几个例外,表明各种类型的错误。

因此, TestExtensionContext#getTestException()的异常TestExtensionContext#getTestException()表示错误。 该方法无法处理实际的测试结果,因此根据您的使用情况,您可能希望实现TestExecutionExceptionHandler ,它允许您吞下异常,从而更改测试是否成功。

你快到了。

要实现测试执行回调并获取用于记录(或生成报告)的测试结果,您可以执行以下操作:

import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
import org.junit.jupiter.api.extension.ExtensionContext;

public class TestResultExtension implements AfterTestExecutionCallback
{
    @Override
    public void afterTestExecution(ExtensionContext context) throws Exception
    {
        // check the context for an exception 
        Boolean passed = context.getExecutionException().isEmpty();
        
        // if there isn't, the test passed
        String result = passed ? "PASSED" : "FAILED";

        // now that you have the result, you can do whatever you want 
        System.out.println("Test Result: " + context.getDisplayName() + " " + result);
    }
}

然后您只需使用 @ExtendWith() 注释为您的测试用例添加 TestResultExtension :

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import static org.junit.jupiter.api.Assertions.assertTrue;

@ExtendWith(TestResultExtension.class)
public class SanityTest
{
    @Test
    public void testSanity()
    {
        assertTrue(true);
    }

    @Test
    public void testInsanity()
    {
        assertTrue(false);
    }
}

扩展包含扩展的基础测试是个好主意

import org.junit.jupiter.api.extension.ExtendWith;

@ExtendWith(TestResultExtension.class)
public class BaseTest
{}

然后您不需要在每个测试中都包含注释:

public class SanityTest extends BaseTest
{ //... }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM