如何在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
准备依赖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
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取样器
- 编写自定义取样器类:实现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() {} }
- 打包部署:将该类打包成Jar包,放入JMeter的
lib/ext目录,重启JMeter后即可在Java Request取样器中选择该类执行测试。
注意事项
- 确保JMeter
lib/ext目录中所有依赖Jar的版本与项目JUnit 5版本一致,避免版本冲突 - JSR223 Sampler优先选择Groovy语言,性能和简洁性优于Java
- 测试类的全限定名需准确,确保JMeter能正确加载到目标类
内容的提问来源于stack exchange,提问作者Anastasiia Stelmakhova
相关产品推荐
相关产品推荐

