我有一个带有几个参数化(集成)测试的Junit5测试类.大多数测试使用MethodSource分,这可能会根据外部因素产生不同数量的论点.

当我运行测试时,我只得到在整个运行中执行的测试总量,无论是在junit IDE集成中还是在Surefire报告中.但我需要的是基于每个方法的这些数字.也就是说,不是

Tests failed: 808, passed: 2366

我需要这样的东西:

Test_1 failed: 200, passed: 1000
Test_1 failed: 100, passed: 1000
Test_1 failed: 508, passed: 366

有没有开箱即用的工具可以做到这一点?我可以分析Surefire报告来提取这些信息,但我想我不愿意相信这是最好的解决方案.

我知道我可以有几个测试运行,每个测试运行只执行一个测试方法.不过,我不想这样做,因为在一次测试执行期间,与外部组件的通信是缓存的,我不能失go 这一好处.

推荐答案

一种灵活的方法是在JUnit5中创建自定义测试侦听器或扩展,以收集和记录每个测试方法的统计信息.

简单的例子:

import java.util.HashMap;
import java.util.Map;

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

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class PerMethodStatisticsExtension implements AfterAllCallback, AfterTestExecutionCallback {
    private final Map<String, Integer> passedCount = new HashMap<>();
    private final Map<String, Integer> failedCount= new HashMap<>();

    @Override
    public void afterTestExecution(ExtensionContext context) {
        final String testMethodName = context.getTestMethod().get().getName();
        if (context.getExecutionException().isPresent()) {
            failedCount.merge(testMethodName, 1, Integer::sum);
        } else {
            passedCount.merge(testMethodName, 1, Integer::sum);
        }
    }
    @Override
    public void afterAll(final ExtensionContext extensionContext) throws Exception {
        log.info("Passed test statistics: " + passedCount);
        log.info("Failed test statistics: " + failedCount);
    }
}

然后,您可以在测试类中注册此扩展,如下所示:

@ExtendWith(PerMethodStatisticsExtension.class)
public class YourTest {
    @Test
    void testMethod1() {
        // Your test logic
    }

    @Test
    void testMethod2() {
        // Your test logic
    }
}

如果这没有帮助,请考虑提供一些测试类的更多信息.

祝好运!

Java相关问答推荐

填写文本字段后锁定PDF

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

如何使用值中包含与号的查询参数创建一个java.net.URI

使用PDFBox从PDF中删除图像

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

如何在JavaFX中制作鼠标透明stage

允许同时执行两个方法,但不能同时执行这两个方法

Cordova Android Gradle内部版本组件不兼容

Java在操作多个属性和锁定锁对象时使用同步和易失性

try 使用预准备语句占位符获取信息时出现Try-With-Resources错误

如何在SWT菜单项文本中保留@字符

如何通过Java java.lang.Foreign API访问本机字节数组

我该如何为我的类编写getter和setter方法?

如何在Spring Security中设置一个任何人都可以打开的主页?

让标签占用JavaFX中HBox的所有可用空间

org.springframework.web.HttpRequestMethodNotSupportedException:请求方法';帖子';不支持

如何使用stream.allMatch()为空流返回false?

获取月份';s在java中非UTC时区的开始时间和结束时间

声纳覆盖范围为 0%,未生成 jacoco.xml

找不到 jar 文件系统提供程序try 使用 jdeps 和 jlink 创建收缩 Java 映像来运行 Minecraft