一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本 (上)

简介: ​接上篇,一键转化将接口测试平台测试用例转化成Jmeter压测脚本思路,这里我首先在java 上面做了一个简单的实验,看看 转化的中间遇到的问题,这里呢,我只是给了一个简单的demo 版本,后续结合项目的实际的实用,还是靠各位,贴合我们的实际的项目去制定适合本公司转化的脚本。具体的业务还是要实际的分析的。首先看下我的思路

       1.点击一键生成


       2.后台拿到测试环境id,测试用例id

       

      3.后台去交验是否存在测试环境,测试用例id。


       4.后台开始根据用例请求参数,组织Jmeter脚本


       5.产生的脚本代码保存到本地的目录。并且将脚本的项目的信息存储到数据库


       6.前台选择执行的测试计划,远程执行的服务器,


       7.根据前端的配置的测试计划,获取对应的本地的脚本,复制到远程的服务器上


       8.通过ssh链接直接操作远程服务器开启操作。


       9.查看远程测试报告的数据,压测过程中监控


       10.测试完毕,收集汇总,如有历史记录,对比历史记录的性能差别


      上述呢,是我在整个转化的地方,想到的逻辑的,大概在上面的流程上,那么基于大概的上面的设计,我们去设计我们的代码。


       我这里的设计,是增加了一个针对存储测试脚本的一个数据表,这里存储到对应的接口的压测脚本的详细信息,包括执行的服务器的信息。具体的数据库的设计如下。

import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Date;
/**
 * @Description  存储压测文件的
 * @create 2020-04-27 21:04
 */
@Data
@Entity
public class PerTestjmx {
    //存储转化后的压测文件
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private Integer project;
    private Integer adduser;
    private String serverip;
    private String serverpassword;
    private String name;
    private String runcount;
    private String loopcount;
    private String jmxpath;
    private Date addtime;
    private Date updatime = this.addtime;
    private Integer updateuser;
}


  设计完,我们的数据库,我们去访问底层数据模型的接口。这里我们先暂时的只是简单的实现,并没有拓展其他的方法。因为原生的访问模型就满足了。


package pan.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import pan.DaoObject.PerTestjmx;
/**
 * @Description
 *
 * @create 2020-04-27 21:06
 */
public interface PerTestjmxRepository extends JpaRepository<PerTestjmx,Integer> {
}


那么,我们接下来要实现的就是,我们转化用例的地方,这里我拆分了两个步骤,


       1.一个是产生脚本


       2.复制产生的脚本


       接下来,我们就会设计这个两个的实现的方法。


      我们在接口用例的接口中定义这样的两个方法,

    String  makePerTest(PerTestParamForm perTestParamForm);
  boolean runPerServer(RunServerFrom runServerFrom);


@Data
@ApiModel
public class PerTestParamForm {
//    @NotEmpty(message = "测试环境不能为空")
private Integer testevents;
//    @NotEmpty(message = "转换的caseid 不能为空")
    private Integer caseid;
//    @NotEmpty(message = "并发数不能为空")
    private Integer loopcount;
//    @NotEmpty(message = "运行次数")
    private Integer runcount;
    private  String runserverip;
    private  String runserverpassword;
}



@Data
@ApiModel
public class RunServerFrom {
    @NotEmpty(message = "用例的id 不能为空")
    private Integer id;
    @NotEmpty(message = "服务器的ip不能为空")
    private  String serverip;
    @NotEmpty(message = "远程登录服务的密码不能唯恐")
    private String passowrd;


我们可以在接口用例的实现方法去实现这样的两个功能。


如下的步骤: /*    产生压测脚本     */   
 @Override
    public String makePerTest(PerTestParamForm perTestParamForm) {
        Interfacecase interfacecase;
        Project project;
        Interface intefa;
        Testenvironment testenvironment;
        try{
            interfacecase=interfaceCaseRepository.findById(perTestParamForm.getCaseid()).get();
        }catch (NoSuchElementException e){
            throw  new PanExection(ResultEmus.CASE_NOT_EXIT);
        }
        try {
            project=projectRepository.findById(interfacecase.getProject()).get();
        }catch (NoSuchElementException e){
            throw new PanExection(ResultEmus.PROJECT_NOT_EXIT);
        }
        try{
            intefa=interfaceRepository.findById(interfacecase.getInterfaceid()).get();
        }catch (NoSuchElementException e){
            throw new PanExection(ResultEmus.INTERFACE_NOT_EXCIT);
        }
        try{
            testenvironment=testevironmentRepository.findById(Integer.valueOf(perTestParamForm.getTestevents())).get();
        }catch (NoSuchElementException e){
            throw  new PanExection(ResultEmus.TESTEVE_NO_EXIT);
        }
        Integer port;
        try {
            port= Integer.valueOf(testenvironment.getUrl().split("://")[1].split(":")[1]);
        }catch (ArrayIndexOutOfBoundsException e){
            port=80;
        }
        CreateJmeterUntil createJmeterUntil=new CreateJmeterUntil();
        String conetcn=createJmeterUntil.makejxm(perTestParamForm.getLoopcount().toString(),perTestParamForm.getRuncount().toString(), testenvironment.getUrl().split("://")[1].split(":")[0],port.toString()
                ,intefa.getPath(),interfacecase.getMethod(),project.getProjectname(),project.getProjectname());
        WriteRepost writeRepost=new WriteRepost();
        String name=interfacecase.getNumbering()+"_"+RandomFunction.getRandomString(20);
        String filepath=writeRepost.writPerf(conetcn,name);
        //存储产生测试用例
        PerTestjmx perTestjmx=new PerTestjmx();
        perTestjmx.setAdduser(1);
        perTestjmx.setAddtime(new Date());
        perTestjmx.setJmxpath(filepath);
        perTestjmx.setLoopcount(perTestjmx.getLoopcount());
        perTestjmx.setRuncount(perTestjmx.getRuncount());
        perTestjmx.setProject(project.getId());
        perTestjmx.setServerip(perTestParamForm.getRunserverip());
        perTestjmx.setServerpassword(perTestParamForm.getRunserverpassword());
        perTestjmx.setUpdateuser(1);
        perTestjmx.setName(name);
        perTestjmxRepository.save(perTestjmx);
        return "OK";
    }
    @Override
    public boolean runPerServer(RunServerFrom runServerFrom) {
        //执行远程测试脚本
        PerTestjmx perTestjmx = null;
        try {
            perTestjmx =perTestjmxRepository.findById(runServerFrom.getId()).get();
        }catch (NoSuchElementException e){
            log.error(e.getMessage());
        }
        if (perTestjmx.getJmxpath()!=null){
            //复制文件到远程服务器
            String cmdcopy="sshpass -p "+runServerFrom.getPassowrd()+" scp -P 6789  "+perTestjmx.getJmxpath()+" root@"+runServerFrom.getServerip()+":/home";
            try {
                Process p = Runtime.getRuntime().exec(cmdcopy);
            } catch (IOException e) {
                log.error(e.getMessage());
            }
            //链接远程服务器执行命令 这里前提你要配置好jmeter的执行环境
            String cmd="./jmeter -n -t /home"+perTestjmx.getName();
            SshTools sshTools=new SshTools();
            String reslut=sshTools.ssh_tool(cmd,runServerFrom.getPassowrd(),runServerFrom.getServerip());
            return true;
        }
        return false;
    }

 

          其实这中间的实现是特别简单的,代码中SshTools 代码可以看下一文告知Java如何实现通过ssh 和远程服务器开展对话聊天。 产生脚本的代码,一个是jmx文件的拼接,这里根据大家平时对jmx文件的代码的解析 就可以拼接出来的。产生后会放在本地的文件中。


   大家可以根据自己的项目去定制的,写完实现的方法后,要去实现对应的api。

相关文章
|
8月前
|
关系型数据库 MySQL 测试技术
【分享】AgileTC测试用例管理平台使用分享
AgileTC 是一个脑图样式测试用例管理平台,支持用例设计、执行与团队协作,帮助测试人员高效管理测试流程。
427 116
【分享】AgileTC测试用例管理平台使用分享
|
8月前
|
人工智能 数据可视化 测试技术
Postman 性能测试教程:快速上手 API 压测
本文介绍API上线后因高频调用导致服务器告警,通过Postman与Apifox进行压力测试排查性能瓶颈。对比两款工具在批量请求、断言验证、可视化报告等方面的优劣,探讨API性能优化策略及行业未来发展方向。
Postman 性能测试教程:快速上手 API 压测
|
8月前
|
人工智能 数据可视化 测试技术
AI测试平台自动遍历:低代码也能玩转全链路测试
AI测试平台的自动遍历功能,通过低代码配置实现Web和App的自动化测试。用户只需提供入口链接或安装包及简单配置,即可自动完成页面结构识别、操作验证,并生成可视化报告,大幅提升测试效率,特别适用于高频迭代项目。
|
8月前
|
人工智能 测试技术 调度
写用例写到怀疑人生?AI 智能测试平台帮你一键生成!
霍格沃兹测试开发学社推出AI智能测试用例生成功能,结合需求文档一键生成高质量测试用例,大幅提升效率,减少重复劳动。支持自定义提示词、多文档分析与批量管理,助力测试人员高效完成测试设计,释放更多时间投入核心分析工作。平台已开放内测,欢迎体验!
|
8月前
|
人工智能 测试技术 项目管理
测试不再碎片化:AI智能体平台「项目资料套件」功能上线!
在实际项目中,需求文档分散、整理费时、测试遗漏等问题常困扰测试工作。霍格沃兹推出AI智能体测试平台全新功能——项目资料套件,可将多个关联文档打包管理,并一键生成测试用例,提升测试完整性与效率。支持套件创建、文档关联、编辑删除及用例生成,适用于复杂项目、版本迭代等场景,助力实现智能化测试协作,让测试更高效、更专业。
|
9月前
|
存储 人工智能 算法
AI测试平台实战:深入解析自动化评分和多模型对比评测
在AI技术迅猛发展的今天,测试工程师面临着如何高效评估大模型性能的全新挑战。本文将深入探讨AI测试平台中自动化评分与多模型对比评测的关键技术与实践方法,为测试工程师提供可落地的解决方案。
|
11月前
|
存储 测试技术 虚拟化
VMmark 4.0.3 - 虚拟化平台基准测试
VMmark 4.0.3 - 虚拟化平台基准测试
318 0
VMmark 4.0.3 - 虚拟化平台基准测试
|
8月前
|
人工智能 自然语言处理 测试技术
AI测试平台的用例管理实践:写得清晰,管得高效,执行更智能
在测试过程中,用例分散、步骤模糊、回归测试效率低等问题常困扰团队。霍格沃兹测试开发学社推出的AI测试平台,打通“用例编写—集中管理—智能执行”全流程,提升测试效率与覆盖率。平台支持标准化用例编写、统一管理操作及智能执行,助力测试团队高效协作,释放更多精力优化测试策略。目前平台已开放内测,欢迎试用体验!
|
11月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
1500 23
|
9月前
|
存储 人工智能 文字识别
从零开始打造AI测试平台:文档解析与知识库构建详解
AI时代构建高效测试平台面临新挑战。本文聚焦AI问答系统知识库建设,重点解析文档解析关键环节,为测试工程师提供实用技术指导和测试方法论

热门文章

最新文章