spring 有没有办法在加特林模拟中使用Sping Boot bean?

xqkwcwgp  于 2023-02-03  发布在  Spring
关注(0)|答案(3)|浏览(141)

我目前正在编写一个Sping Boot 应用程序,它将在另一个应用程序上执行负载测试。我想使用Gatling来管理测试,但我需要它来访问我在Spring应用程序的bean中定义的配置。
以下是我希望看到的效果:

public class MySimulation extends Simulation {

    @Autowired    
    private JMSConnectionFactoryBeanClass myConnectionFactory;

    public MySimulation() {

        JmsProtocolBuilder jmsProtocol = jms.connectionFactory(myBean);

        ScenarioBuilder scn = scenario("My Simulation Scenario")
                .exec(
                        jms("test")
                                .send()
                                .queue("myQueue")
                                .textMessage("message")
                );

        {
            setUp(
                    scn.injectOpen(rampUsers(10).during(5))
            ).protocols(jmsProtocol);
        }
    }

当我将配置硬编码到模拟类中并删除所有@Autowired的东西时,一切都正常,所以它一定来自依赖注入。有人知道是否有办法在gatling模拟中使用spring bean吗?

piwo6bdm

piwo6bdm1#

下面是我根据Stéphane Landelle的建议所做的工作,但我没有在模拟中创建应用上下文,而是使用gatling API来运行模拟沿着Spring应用:

public class GatlingRunner {
    public static void run() {
        GatlingPropertiesBuilder props = new GatlingPropertiesBuilder();
        props.simulationClass("path.to.Simulation");
        Gatling.fromMap(props.build());
    }
}

下面是我修改spring应用的过程:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        GatlingRunner.run();
    }
}

最后,为了在模拟中使用Springbean,我编写了一个上下文提供程序,它将在Spring和Gatling之间建立链接:

@Component
public class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContext context;

    public static ApplicationContext getApplicationContext() {
        return context;
    }

    @Override
    public void setApplicationContext(ApplicationContext context)
            throws BeansException {
        ApplicationContextProvider.context = context;
    }
}

现在,要在模拟中得到一个bean,我所需要的就是这个:

Bean myBean = ApplicationContextProvider.getApplicationContext()
                    .getBean("myBean", Bean.class)
6ss1mwsb

6ss1mwsb2#

不能使用@Autowired,必须以编程方式创建一个ApplicationContext,并从中提取JMSConnectionFactoryBeanClass。

dnph8jn4

dnph8jn43#

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MySimulation.class, loader = SpringApplicationContextLoader.class)
public class MySimulation extends GatlingTest {
 
  @Autowired
  private JMSConnectionFactoryBeanClass myConnectionFactory;
 
  @Test
  public void test() {
    ...
  }
}

相关问题