一文揭秘测试平台中是如何将测试用例一键转化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@Entitypublic 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;
    }

 

NetCore项目实战篇02—全局异常处理



    ​    ​   实在这中心的实现是稀奇简朴的,代码中SshTools 代码可以看下一文见告Java若何实现通过ssh 和远程服务器开展对话谈天。​ 发生剧本的代码,一个是jmx文件的拼接,这里凭据人人平时对jmx文件的代码的剖析 就可以拼接出来的。​发生后会放在内陆的文件中。

 

    ​    ​人人可以凭据自己的项目去定制的,写完实现的方式后,​要去实现对应的api。

    ​    ​

@GetMapping("/make")
    public ResultVO make(@Valid PerTestParamForm perTestParamForm,
                         BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            throw new PanExection(ResultEmus.PARM_ERROR.getCode(), bindingResult.getFieldError().getDefaultMessage());
        }
        String interfacecase = interfaceCaseService.makePerTest(perTestParamForm);
        return ResultVOUntils.success(interfacecase);
    }

    @GetMapping("/runPerServer")
    public ResultVO runPerServer(@Valid RunServerFrom perTestParamForm,
                         BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            throw new PanExection(ResultEmus.PARM_ERROR.getCode(), bindingResult.getFieldError().getDefaultMessage());
        }
        boolean reslut = interfaceCaseService.runPerServer(perTestParamForm);
        if (reslut){
            return ResultVOUntils.success();
        }
        return ResultVOUntils.error("执行失败");
    }

 

  
    ​    ​​实现了两个的api。然后我们可以启动内陆的代码去调试对应的程序。​若是人人没有那么多的服务器可以测试的,可以参考我之前写的一篇文章。开必杀技--docker安装Ubuntu系统实战 。
可以行使docker 虚拟化几台服务器做测试用,稀奇简朴的。​我们可以用Jmeter去打开我们的实现的剧本代码的。
一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测剧本

 

 


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

 


 

 

    ​    ​最后写入照样返回我们的监控的平台

    ​

    ​    ​​说一下这个demo的瑕玷。由于是一个demo,​它一定有瑕玷的,瑕玷如下。

    ​    ​1.数据库设计,没有前瞻性,​数据库设计只是为了知足当前的开发需要,不利于后续的调换。

    ​    ​2.功效的实现 中。

    ​    ​    ​2.1 参数是牢固的​。

    ​    ​    ​2.2 没有参数化

    ​    ​    ​2.3没有兼容到csv的大数据

    ​    ​    ​2.4依赖登录没有处置

    ​    ​    ​2.5断言不天真

    ​    ​    ​2.6 缺乏数据的对比

            2.7 ​适配营业场景测试不足。

也许我现在想到的有以上的不足,固然了,这是一个需要逐步优化的,在后续的连续迭代中,我会将上面的不足弥补​。

    ​    ​  上述的就是一个大致的demo版本,大致的流程就是这样实现的,由于这是一个完整的平台,以是许多的代码的实现 都是复用原有的,大致的功效都已经能够实现的。关于整个测试平台的开发,后续有机遇可以在群里给人人开放系列的课程的,现在的python版本的测试平台已经开源。放在了https://github.com/liwanlei/FXTest, 迎接人人star,后续等这个功效 完善后,我会在维护开源的平台的时刻,作为一个版本的迭代功效 坐上去。迎接人人连续关注。

    ​    ​ 

    ​    ​现在是五一假期,祝人人五一快乐。

 

    ​    ​

 

原创文章,作者:28rg新闻网,如若转载,请注明出处:https://www.28rg.com/archives/7605.html