一文揭秘测试平台中是如何将测试用例一键转化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。
@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去打开我们的实现的脚本代码的。
最后写入还是返回我们的监控的平台
说一下这个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,后续等这个功能 完美后,我会在维护开源的平台的时候,作为一个版本的迭代功能 坐上去。欢迎大家持续关注。
现在是五一假期,祝大家五一快乐。
一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本的更多相关文章
- 【后台测试】手把手教你jmeter压测
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5611555.html 我知道我迟早是要踏上了后台测试之路 ...
- ab压力测试工具-批量压测脚本
ab(Apache benchmark)是一款常用的压力测试工具.简单易用,ab的命令行一次只能支持一次测试.如果想要批量执行不同的测试方式,并自动对指标进行分析,那么单靠手工一条一条命令运行ab,估 ...
- jmeter压测--从文本中读取参数
由于之前从数据库获取查询结果作为请求的入参(使用场景:测试一个接口并发处理数据的能力,并且每次请求传入的参数都要不同.),会一定程度上造成对数据库的压测,在没有完全搞清楚多线程之间参数的传递之前,我们 ...
- JMeter 压测基础(四)——Java工程测试
JMeter Java工程测试 1.eclipse中新建工程 2.导入需要的jar包 从JMeter安装目录lib/ext中两个jar包buildPath到Java project中,分别是“Apac ...
- 性能测试:Jmeter压测过程中的短信验证码读取
问题背景 现如今国内的大部分软件或者网站应用,普遍流行使用短信业务,比如登录.注册以及特定的业务通知等. 对于这些业务,在使用Jmeter进行性能测试的过程中,就会需要自动获取和填入短信验证码,否则性 ...
- 压力测试(九)-Jmeter压测课程总结和架构浅析
安装常见问题 1.问题 [root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server Created remote object: UnicastServer ...
- 04-SV连接设计和测试平台
1.验证一个设计的步骤: 生成输入激励,捕捉输出响应,决定对错和进度 2.连接设计和测试平台 信号连接:SystemVerilog已经扩展了传统的reg类型,可以像wire那样用来连接模块,它的新名字 ...
- kali上部署dvwa漏洞测试平台
kali上部署dvwa漏洞测试平台 一.获取dvwa安装包并解压 二.赋予dvwa文件夹相应权限 三.配置Mysql数据库 四.启动apache2和mysql服务 五.在网页配置dvwa 六.登陆到D ...
- 全链路压测平台(Quake)在美团中的实践
背景 在美团的价值观中,以“客户为中心”被放在一个非常重要的位置,所以我们对服务出现故障越来越不能容忍.特别是目前公司业务正在高速增长阶段,每一次故障对公司来说都是一笔非常不小的损失.而整个IT基础设 ...
随机推荐
- Flask入门 之 endpoint
首先,要纠正两个错误! 1.flask是通过endpoint找到viewfunction(视图函数的),并不是通过路由直接找到viewfunction的. 2.是url_for(endpoint)而不 ...
- Linux 压缩备份篇(一 压缩与解压缩)
.Z compress程序压缩的档案 .bz2 bzip2程序压缩的档案 .gz gzip程序压缩的档案 .t ...
- 3.K均值算法
一.概念 K-means中心思想:事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新 ...
- 这份Java Web必读书单,值得所有Java工程师一看!
点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! 经过了10多年的发展,Java Web从开发框架到社区都已经非常成熟,而目前市面上最流行的Jav ...
- 37.4 net--TcpDemo2模拟用户登陆
package day35_net_网络编程.tcp传输.模拟用户登录; import java.io.*; import java.net.InetAddress; import java.net. ...
- matplotlib TransformedPath和TransformedPatchPath
10:42:54 10:42:57 --Edit by yangray TransformedPath 继承于 TransformNode,支持对Path(曲线)执行非仿射变换并保存变换后的拷贝至缓存 ...
- std::lock_guard和std::unique_lock的区别
std::lock_guard 1 初始化的时候锁定std::mutex std::mutex m_mtx; std::lock_guard<std::mutex> m_lock(m_mt ...
- ******Prometheus(二)***********
Prometheus的数据与安全模型: (1)Metric (度量)名字就是描述采集数据的名称——例如,website_visits_total 作为网站访问总数.名称可以包含ASCII字母.数字.下 ...
- Hadoop学习笔记(1)-Hadoop在Ubuntu的安装和使用
由于小编在本学期有一门课程需要学习hadoop,需要在ubuntu的linux系统下搭建Hadoop环境,在这个过程中遇到一些问题,写下这篇博客来记录这个过程,并把分享给大家. Hadoop的安装方式 ...
- 转载:URL链接中的不同用处
,井号:表示网页中的一个位置,被称之为锚点,常用于某个网页间不同位置的跳转,简单的说就是在一个网页中,URL 不变的情况下,通过添加"#buy"的字符在 URL 最后可以跳转到当前 ...