• Jmetersphere性能压测执行过程


     (1)  首先在controller层,通过RunTestPlanRequest接收请求参数

    1. @PostMapping("/run")
    2. public String run(@RequestBody RunTestPlanRequest request)

    (2) 在PerformanceTestService中的run中进行具体的逻辑处理,

      首先根据请求中ID来获取库中存储的测试用例信息(判空和运行状态判断)

    1. final LoadTestWithBLOBs loadTest = loadTestMapper.selectByPrimaryKey(request.getId());
    2. if (request.getUserId() != null) {
    3. loadTest.setUserId(request.getUserId());
    4. }
    5. if (loadTest == null) {
    6. MSException.throwException(Translator.get("run_load_test_not_found") + request.getId());
    7. }
    • 后根据查出的用例信息中资源池id,判断此id资源池是否存在和状态有效,
    1. String testResourcePoolId = loadTest.getTestResourcePoolId();
    2. TestResourcePool testResourcePool = testResourcePoolMapper.selectByPrimaryKey(testResourcePoolId);
    3. if (testResourcePool == null) {
    4. MSException.throwException(Translator.get("test_resource_pool_not_exists"));
    5. }
    6. if (ResourceStatusEnum.INVALID.name().equals(testResourcePool.getStatus())) {
    7. MSException.throwException(Translator.get("test_resource_pool_invalid"));
    8. }
    •   并检查kafka是否可通
    1. String bootstrapServers = kafkaProperties.getBootstrapServers();
    2. String[] servers = StringUtils.split(bootstrapServers, ",");
    3. try {
    4. for (String s : servers) {
    5. String[] ipAndPort = s.split(":");
    6. //1,建立tcp
    7. String ip = ipAndPort[0];
    8. int port = Integer.parseInt(ipAndPort[1]);
    9. Socket soc = new Socket();
    10. soc.connect(new InetSocketAddress(ip, port), 1000); // 1s timeout
    11. //2.输入内容
    12. String content = "1010";
    13. byte[] bs = content.getBytes();
    14. OutputStream os = soc.getOutputStream();
    15. os.write(bs);
    16. //3.关闭
    17. soc.close();

     然后根据不同的资源池类型,实例化不同的Engine,比如是node节点类型,new DockerTestEngine(loadTest);  若是k8s类型则(Engine) ConstructorUtils.invokeConstructor(kubernetesTestEngineClass,loadTest);   其中如果节点类型实例化,主要做两个工作,一是初始化工作,比如threadNum,JMETER_IMAGE,HEAP,二是从容器获取RestTemplate,用于之后的请求。

    1. final ResourcePoolTypeEnum type = ResourcePoolTypeEnum.valueOf(resourcePool.getType());
    2. if (type == ResourcePoolTypeEnum.NODE) {
    3. return new DockerTestEngine(loadTest);
    4. }
    5. if (type == ResourcePoolTypeEnum.K8S) {
    6. try {
    7. return (Engine) ConstructorUtils.invokeConstructor(kubernetesTestEngineClass, loadTest);
    • 通过startEngine,开始执行用例,首先设置测试报告开始时间等基础信息,然后调用engine中start方法,开始执行,start处理上又分为:

      判断当前需要的并发线程是否小于空闲线程数

    1. int totalThreadNum = resourceList.stream()
    2. .filter(r -> ResourceStatusEnum.VALID.name().equals(r.getStatus()))
    3. .map(r -> JSON.parseObject(r.getConfiguration(), NodeDTO.class).getMaxConcurrency())
    4. .reduce(Integer::sum)
    5. .orElse(0); //获取所有有效资源池的最大并发数,并累加
    6. if (threadNum > totalThreadNum - runningSumThreadNum) {
    7. MSException.throwException(Translator.get("max_thread_insufficient"));
    8. }

      计算各个资源池最大并发数占总的并发数比例

    1. Object[] resourceRatios = resourceList.stream()
    2. .filter(r -> ResourceStatusEnum.VALID.name().equals(r.getStatus()))
    3. .map(r -> JSON.parseObject(r.getConfiguration(), NodeDTO.class).getMaxConcurrency())
    4. .map(r -> r * 1.0 / totalThreadNum)
    5. .map(r -> String.format("%.2f", r))
    6. .toArray();// 各个资源池最大并发数占总的并发数比例

    开始利用资源池进行测试,如 准备启动jmeter容器时需要的环境参数,比如镜像,测试ID,报告ID,topic等,后通过RestTemplate 向node controller发送启动容器请求,并将对应的环境参数传递过去 。node

    controller在接收到请求后创建jmeter容器,jmeter容器会根据对应的环境参数去metis平台自动下载jmx, 从而开始压测。

    小结:

    最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    在这里插入图片描述

    这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!   

  • 相关阅读:
    系统运维网络知识汇总
    springcloud网关和过滤器的初步使用
    [Web Server]Tomcat调优之SpringBoot内嵌Tomcat源码分析
    苹果cms模板MXone V10.7魔改版源码 全开源
    护眼灯真的可以护眼吗?2022护眼台灯该怎样选择
    SpringBoot使用AOP详解
    Adaptive AUTOSAR CM模块介绍(三)
    《恋上数据结构与算法》第1季:动态数组原理实现(图文并茂,一文带你了解ArrayList底层实现)
    SpringBoot内置工具内
    Nature Microbiology|益生菌的菌株特异性影响驱动早产儿肠道微生物组的发展
  • 原文地址:https://blog.csdn.net/qq_48811377/article/details/133274014