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。