在之前的文章一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本,介绍了在spring boot搭建的接口测试平台,最近在维护开源的接口平台,基于flask搭建的,里面的思路可以参考spring boot整体的思路是一样的,只是这次是flask 版本实现的。项目的源码地址:https://github.com/liwanlei
我们对数据库设计进行改造。
class TestJmx(db.Model):
"存储测试用例转化的脚本"
__tablename__ = 'testjmx'
id = db.Column(db.Integer(), primary_key=True, autoincrement=True)
intefaceid = db.Column(db.Integer())
runcounttest = db.Column(db.String(252))
loopcount = db.Column(db.String(252))
jmxpath = db.Column(db.String(252))
serverid = db.Column(db.Integer())
status = db.Column(db.Integer(), default=0) # 0是创建,1执行中
def __repr__(self):
return str(self.id)
class Testerver(db.Model):
'''测试服务器'''
__tablename__ = 'testservers'
id = db.Column(db.Integer(), primary_key=True, autoincrement=True)
ip = db.Column(db.String(252))
port = db.Column(db.Integer(), default=22)
loginuser = db.Column(db.String(64), default="root")
loginpassword = db.Column(db.String(64), default="123456")
name = db.Column(db.String(64))
status = db.Column(db.Integer(), default=0) # 0正常,1删除
createuser = db.Column(db.Integer(), default=0)
creatdate = db.Column(db.Date(), default=datetime.datetime.now())
updateuser = db.Column(db.Integer(), default=createuser)
updatetime = db.Column(db.Date(), default=datetime.datetime.now())
def __repr__(self):
return str(self.name)
增加一个存储脚本使用的数据表,增加一个服务器存储的数据表。
设计好后,我们去同步下,数据库的设计。同步完成,我们可以看到对应的数据表
我们去设计一个转化的url。
case.add_url_rule("/casetojmx",view_func=CaseToJmx.as_view("casetojmx"))
那么我们去设计下CaseToJmx的逻辑。整体的逻辑是如下的
1.点击一键生成
2.后台拿到测试环境id,测试用例id
3.后台去交验是否存在测试环境,测试用例id。
4.后台开始根据用例请求参数,组织Jmeter脚本
5.产生的脚本代码保存到本地的目录。并且将脚本的项目的信息存储到数据库
6.前台选择执行的测试计划,远程执行的服务器,
7.根据前端的配置的测试计划,获取对应的本地的脚本,复制到远程的服务器上
8.通过ssh链接直接操作远程服务器开启操作。
9.查看远程测试报告的数据,压测过程中监控
10.测试完毕,收集汇总,如有历史记录,对比历史记录的性能差别
目前这个里面的我们只需要实现前5步,产生测试脚本。那么我们去按照这个去设计我们的入参即可。设计入参如下
{
"interfaceid":"16", 接口caseid
"testid":"8", #测试环境id
"runcount":111, # 并发数
"loopcount":999, #执行循环数
"dbname":"test", #数据名称
"testserverid":1 #测试服务器id
}
这个json格式的参数,我们到后台接受,处理即可。代码如下
class CaseToJmx(MethodView):
def post(self):
try:
projec =eval(request.get_data().decode('utf-8'))
except Exception as e:
return jsonify({'code': 99, 'messgage': '格式不正确', 'data': ''})
interfaceid = projec["interfaceid"]
testid = projec["testid"]
runcount = projec["runcount"]
loopcount = projec["loopcount"]
dbname = projec["dbname"]
testserverid = projec["testserverid"]
case_one = InterfaceTest.query.filter_by(id=int(interfaceid)).first()
if not case_one:
return jsonify({'code': 99, 'messgage': '没有测试用例', 'data': ''})
testvents = Interfacehuan.query.filter_by(id=int(testid)).first()
if not case_one:
return jsonify({'code': 99, 'messgage': '测试环境不存在', 'data': ''})
tetserver = Testerver.query.filter_by(id=int(testserverid), status=0).first()
if not tetserver:
return jsonify({'code': 99, 'messgage': '测试服务器不存在', 'data': ''})
all = str(testvents.url).split("://")[1].split(":")
if len(all) == 1:
port = 80
else:
port = int(all[1])
if not testvents:
return jsonify({'code': 99, 'messgage': '测试环境不存在', 'data': ''})
parame=""
if case_one.Interface_pase is not None:
try:
data=eval(case_one.Interface_pase)
for key ,value in data.items():
parame+='''' <elementProp name="password" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">%s</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">%s</stringProp>
</elementProp>'''%(value,key)
except Exception as e:
pass
all = make(runcount, loopcount, all[0], port, case_one.interfaces.Interface_url,
case_one.Interface_meth, dbname, case_one.projects.project_name,parame)
path = os.getcwd()
filepath = path + "/jxmpath/"
name = str(testvents.id) + str(case_one.id) + ".jmx"
filepathname = filepath + name
with open(filepathname, 'wb') as f:
f.write(all.encode())
testjmx = TestJmx(intefaceid=case_one.interfaces.id, runcounttest=runcount, loopcount=loopcount,
jmxpath=filepathname, serverid=tetserver.id)
db.session.add(testjmx)
db.session.commit()
return jsonify({'code': 0, 'messgage': '转化接口压测环境成功', 'data': ''})
这样一个接口就完成了,我们还在创建一个目录,jxmpath,在项目的跟目录。
这样我们的整体就完成了。我们去远程调试下。
提示成功,我们看下目录有产生,我们去看下数据库的数据表。
这样,我们生成就是成功的了。接下来,我们去看下,jmeter打开的脚本是什么样子的,可以正常打开吗。
上述功能实现完毕,脚本可以正常打开,当然了,还要贴合我们的实际的项目呢,进行功能的调优。
还需要完成,脚本的复制,结果的收集的功能,后续将会持续分享,可以持续关注雷子说测试。
如果感觉有用,点亮在看