You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JMeter中运行IntelliJ IDEA里的JUnit 5测试?

在JMeter中运行JUnit 5测试用例的解决方案

问题背景

需在JMeter中执行IntelliJ IDEA内编写的JUnit 5测试用例,但JMeter自带的JUnit Request取样器仅支持JUnit 3和JUnit 4,无法适配JUnit 5。尝试通过Java Request、JSR223 Request取样器结合生成的代码实现,但均未成功,已将项目Jar包放入JMeter的lib/ext目录。

问题分析

之前使用的代码存在核心问题:

  • JSR223示例采用JUnit 4的JUnitCore类,完全不兼容JUnit 5的注解驱动测试模型
  • Java Request示例直接实例化测试类并调用方法,违背JUnit 5的生命周期管理逻辑,@BeforeEach、@Test等注解无法生效

可行解决方案

方案1:使用JSR223 Sampler结合JUnit 5 Launcher API

  1. 准备依赖Jar包:将以下JUnit 5相关Jar包放入JMeter的lib/ext目录(版本需与项目中JUnit 5版本一致):

    • junit-jupiter-api-x.x.x.jar
    • junit-jupiter-engine-x.x.x.jar
    • junit-platform-launcher-x.x.x.jar
    • junit-platform-commons-x.x.x.jar
  2. JSR223 Sampler(推荐Groovy语言)代码示例:

import org.junit.platform.launcher.Launcher
import org.junit.platform.launcher.LauncherDiscoveryRequest
import org.junit.platform.launcher.core.LauncherFactory
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder
import org.junit.platform.launcher.listeners.SummaryGeneratingListener

// 指定要运行的测试类全限定名
def testClass = Class.forName("com.example.MyTest")

// 构建测试发现请求
LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
    .selectors.selectClass(testClass)
    .filters.includeClassNamePatterns(".*")
    .build()

// 创建Launcher和结果监听器
Launcher launcher = LauncherFactory.create()
SummaryGeneratingListener listener = new SummaryGeneratingListener()

// 执行测试
launcher.execute(request, listener)

// 输出测试结果到JMeter日志
def summary = listener.getSummary()
log.info("总测试数: " + summary.getTestsFoundCount())
log.info("成功测试数: " + summary.getTestsSucceededCount())
log.info("失败测试数: " + summary.getTestsFailedCount())
log.info("跳过测试数: " + summary.getTestsSkippedCount())

// 打印失败详情(若有)
summary.getFailures().each { failure ->
    log.error("测试失败: " + failure.getTestIdentifier().getDisplayName())
    log.error("失败原因: " + failure.getException().getMessage())
}

方案2:自定义Java Request取样器

  1. 编写自定义取样器类:实现JMeter的JavaSamplerClient接口,在runTest方法中调用JUnit 5 Launcher API:
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.junit.platform.launcher.Launcher;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;

public class JUnit5TestRunner implements JavaSamplerClient {

    @Override
    public SampleResult runTest(JavaSamplerContext context) {
        SampleResult result = new SampleResult();
        result.sampleStart();

        try {
            // 指定测试类全限定名
            Class<?> testClass = Class.forName("com.example.MyTest");

            // 构建测试执行请求
            LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
                    .selectors.selectClass(testClass)
                    .build();

            // 执行测试
            Launcher launcher = LauncherFactory.create();
            SummaryGeneratingListener listener = new SummaryGeneratingListener();
            launcher.execute(request, listener);

            // 封装测试结果
            var summary = listener.getSummary();
            result.setSuccessful(summary.getTestsFailedCount() == 0);
            result.setResponseData("总测试数: " + summary.getTestsFoundCount()
                    + "\n成功: " + summary.getTestsSucceededCount()
                    + "\n失败: " + summary.getTestsFailedCount()
                    + "\n跳过: " + summary.getTestsSkippedCount(), "UTF-8");

            // 若有失败,追加失败详情
            if (!result.isSuccessful()) {
                StringBuilder failures = new StringBuilder();
                summary.getFailures().forEach(failure -> {
                    failures.append("测试失败: ").append(failure.getTestIdentifier().getDisplayName())
                            .append("\n原因: ").append(failure.getException().getMessage()).append("\n");
                });
                result.setResponseData(failures.toString(), "UTF-8");
            }

        } catch (Exception e) {
            result.setSuccessful(false);
            result.setResponseData("执行出错: " + e.getMessage(), "UTF-8");
            e.printStackTrace();
        } finally {
            result.sampleEnd();
        }

        return result;
    }

    // 以下方法按需实现,默认留空即可
    @Override
    public void setupTest(JavaSamplerContext context) {}

    @Override
    public void teardownTest(JavaSamplerContext context) {}

    @Override
    public void initialize() {}
}
  1. 打包部署:将该类打包成Jar包,放入JMeter的lib/ext目录,重启JMeter后即可在Java Request取样器中选择该类执行测试。

注意事项

  • 确保JMeterlib/ext目录中所有依赖Jar的版本与项目JUnit 5版本一致,避免版本冲突
  • JSR223 Sampler优先选择Groovy语言,性能和简洁性优于Java
  • 测试类的全限定名需准确,确保JMeter能正确加载到目标类

内容的提问来源于stack exchange,提问作者Anastasiia Stelmakhova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:07:07