Spring boot 后端Spring引导,使用JMeter进行RabbitMQ应用程序负载测试
我有带RabbitMQ后端应用程序的Spring引导。我想用JMeter运行JUnit测试用例进行负载测试。当我运行Junit测试用例时,我面临以下错误。OmniRoute类可从其他jar文件获得。当我从IDE运行Junit测试用例时,它运行成功,但当我从JMeter运行它时,我面临以下错误。我也分享了我的代码 错误- testShrotUrlGenerateorg.apache.jmeter.protocol.java.sampler.JUnitSampler$AnnotatedTestCase: mb/omni/proto/OmniRoute Trace-java.lang.NoClassDefFoundError: mb/omni/proto/OmniRoute at mb.omni.shorturl.handlers.ShortUrlGenerationHandlerTest.testShrotUrlGenerateShortUrlGenerationHandlerTest.java:79 在sun.reflect.NativeMethodAccessorImpl.invoke0Native方法在 sun.reflect.NativeMethodAccessorImpl.invokeUnknown源位于 sun.reflect.DelegatingMethodAccessorImpl.invokeUnknown源位于 java.lang.reflect.Method.invokeUnknown源代码位于 org.apache.jmeter.protocol.java.sampler.JUnitSampler$AnnotatedTestCase.runTestJUnitSampler.java:596 位于junit.framework.TestResult.runProtectedTestResult.java:142处 org.apache.jmeter.protocol.java.sampler.JUnitSampler.sampleJUnitSampler.java:396 在 org.apache.jmeter.threads.JMeterThread.doSamplingJMeterThread.java:627 在 org.apache.jmeter.threads.JMeterThread.executeSamplePackageJMeterThread.java:551 在 org.apache.jmeter.threads.JMeterThread.processSamplerJMeterThread.java:490 位于org.apache.jmeter.threads.JMeterThread.runJMeterThread.java:257 位于java.lang.Thread.runUnknown的源代码错误- testShrotUrlGenerateorg.apache.jmeter.protocol.java.sampler.JUnitSampler$AnnotatedTestCase: org/springframework/amqp/rabbit/core/RabbitTemplate跟踪- java.lang.NoClassDefFoundError: org/springframework/amqp/rabbit/core/rabbit模板位于 mb.omni.shorturl.handlers.ShortUrlGenerationHandlerTest.cleanupShortUrlGenerationHandlerTest.java:69 在sun.reflect.NativeMethodAccessorImpl.invoke0Native方法在 sun.reflect.NativeMethodAccessorImpl.invokeUnknown源位于 sun.reflect.DelegatingMethodAccessorImpl.invokeUnknown源位于 java.lang.reflect.Method.invokeUnknown源代码位于 org.apache.jmeter.protocol.java.sampler.JUnitSampler.sampleJUnitSampler.java:400 在 org.apache.jmeter.threads.JMeterThread.doSamplingJMeterThread.java:627 在 org.apache.jmeter.threads.JMeterThread.executeSamplePackageJMeterThread.java:551 在 org.apache.jmeter.threads.JMeterThread.processSamplerJMeterThread.java:490 位于org.apache.jmeter.threads.JMeterThread.runJMeterThread.java:257 在java.lang.Thread.runUnknown源中,由以下原因引起: java.lang.ClassNotFoundException: org.springframework.amqp.rabbit.core.RabbitTemplate位于 java.net.URLClassLoader.findClassUnknown源位于 位于的java.lang.ClassLoader.loadClassUnknown源 java.lang.ClassLoader.loadClassUnknown源。。。还有11个 我正在用下面的gradle文件生成项目的jar文件Spring boot 后端Spring引导,使用JMeter进行RabbitMQ应用程序负载测试,spring-boot,gradle,junit,jmeter,rabbitmq,Spring Boot,Gradle,Junit,Jmeter,Rabbitmq,我有带RabbitMQ后端应用程序的Spring引导。我想用JMeter运行JUnit测试用例进行负载测试。当我运行Junit测试用例时,我面临以下错误。OmniRoute类可从其他jar文件获得。当我从IDE运行Junit测试用例时,它运行成功,但当我从JMeter运行它时,我面临以下错误。我也分享了我的代码 错误- testShrotUrlGenerateorg.apache.jmeter.protocol.java.sampler.JUnitSampler$AnnotatedTestCas
jar {
enabled=true
manifest {
attributes "Main-Class": "MainClassName"
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
下面是我使用RabbitMQ的配置类
@Configuration
@EnableIntegration
@IntegrationComponentScan
public class ShortUrlGenerateConfig {
@Bean
public DirectExchange shortUrlExchange() {
return new DirectExchange("exchange", true, false);
}
@Bean
public Queue shortUrlGenerateQueue() {
return new Queue("queue");
}
@Bean
public Binding shortUrlGenerateBinding() {
return BindingBuilder.bind(shortUrlGenerateQueue()).to(shortUrlExchange()).with("routingKey");
}
@Bean
public ShortUrlGenerationHandler shortUrlGenerationHandler() {
return new ShortUrlGenerationHandler();
}
}
这是我的处理程序类
public class ShortUrlGenerationHandler {
private static final Logger logger = LoggerFactory.getLogger(ShortUrlGenerationHandler.class);
@Autowired
private RabbitTemplate rabTmp;
/**
* @param message
* generate shorturl
*/
@RabbitListener(queues = "queue")
public void consumeMessageFromGenerateQueue(final Message<?> message) {
String routingKey = (String) message.getHeaders().get(AmqpHeaders.RECEIVED_ROUTING_KEY);
logger.info("ShortURL Message received on Queue["+message.getHeaders().get(AmqpHeaders.CONSUMER_QUEUE)+"], Routing Key["+routingKey+"].");
Object correlationId = message.getHeaders().get(AmqpHeaders.CORRELATION_ID);
Object directReplyTo = message.getHeaders().get(AmqpHeaders.REPLY_TO);
ShortURLRequest request = null;
ShortURLRequest.Builder response = null;
try {
request = ShortURLRequest.parseFrom((byte[]) message.getPayload());
response = ShortURLRequest.newBuilder();
if (correlationId == null || directReplyTo == null) {
throw new ResourceNotFoundException("CORRELATION_ID_NOT_FOUND","Invalid Correlation ID, Correlation ID not found",9103);
}
.
.
.
}catch (Exception e) {
logger.error(" Error in consumeMessageFromGenerateQueue method.Error is - " + e.getMessage(), e);
}
logger.info(" response - " + response);
MessageProperties props = MessagePropertiesBuilder.newInstance().setCorrelationId(correlationId.toString())
.build();
rabTmp.send("", directReplyTo.toString(),
MessageBuilder.withBody(response.build().toByteArray()).andProperties(props).build());
}
}
下面是我的Junit测试用例
@Test
public void testShrotUrlGenerate() throws Exception {
OmniRoute omniRoute = OmniRoute.newBuilder()
.setRouteType("AMQP")
.setProcessor("processor")
.setAmqpRoute(OmniAmqpRoute.newBuilder()
.setRoutingkey("routingKey")
.setExchange("exchange")
.build())
.build();
List<OmniRoute> omniRoutes = new ArrayList<>();
omniRoutes.add(omniRoute);
OmniRequest omniRequest = OmniRequest.newBuilder()
.setRequestId("182fd990725011e9a9ca8f4121c06f8b12")
.setRequestType("SHORT_URL")
.addAllRoutes(omniRoutes)
.setUserId(100)
.build();
ShortURL shortUrl = ShortURL.newBuilder().setOriginalUrl("http://dashboard.omni.platform/#/login").setUser(User.newBuilder()
.setUserId(100))
.setMessageId("3")
.setChannel("CHANNEL_ONE")
.build();
ShortURLRequest shortURLRequest = ShortURLRequest.newBuilder().setRequest(omniRequest).addShortUrls(shortUrl).build();
MessageProperties messageProperties = new MessageProperties();
messageProperties.setCorrelationId("1f4a13d0-f3b4-4b4b-98b4-50e9d75d6032");
Message message = new Message(shortURLRequest.toByteArray(), messageProperties);
byte[] responseByte = (byte[]) template.convertSendAndReceive(shortUrlExchange, shortUrlGenerateRoutingKey, message);
ShortURLRequest shortURLResponse = ShortURLRequest.parseFrom(responseByte);
assertTrue(shortURLResponse.getShortUrlsList().get(0).getShortUrlId()>0);
assertEquals(shortURLResponse.getShortUrlsList().get(0).getOriginalUrl(),shortUrl.getOriginalUrl());
assertTrue(shortURLResponse.getShortUrlsList().get(0).getShortUrlCode()!= null);
assertEquals(shortURLResponse.getShortUrlsList().get(0).getUser().getUserId(),shortUrl.getUser().getUserId());
}
NoClassDefFoundError:mb/omni/proto/OmniRoute
这意味着您没有包含该类的.jar
您可以执行以下操作:
task copyRuntimeLibs(type: Copy) {
into "dependencies"
from configurations.testRuntime - configurations.runtime
}
在和调用任务时,项目所需的所有.jar文件都将复制到项目的dependencies文件夹中。一旦有了这些文件,只需告诉JMeter通过查找该文件夹中的.jar,或者将它们复制到JMeter安装的lib文件夹中即可
更多信息: