Spring boot 后端Spring引导,使用JMeter进行RabbitMQ应用程序负载测试

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

我有带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文件

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文件夹中即可

更多信息: