测开技能--接口测试平台增加测试用例一键转化Jmeter

2021-03-15 14:20:32 浏览数 (1)

在之前的文章一文揭秘测试平台中是如何将测试用例一键转化Jmeter压测脚本,介绍了在spring boot搭建的接口测试平台,最近在维护开源的接口平台,基于flask搭建的,里面的思路可以参考spring boot整体的思路是一样的,只是这次是flask 版本实现的。项目的源码地址:https://github.com/liwanlei

我们对数据库设计进行改造。

代码语言:javascript复制
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。

代码语言:javascript复制
case.add_url_rule("/casetojmx",view_func=CaseToJmx.as_view("casetojmx"))

那么我们去设计下CaseToJmx的逻辑。整体的逻辑是如下的

代码语言:javascript复制
1.点击一键生成

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

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

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

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

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

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

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

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

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

目前这个里面的我们只需要实现前5步,产生测试脚本。那么我们去按照这个去设计我们的入参即可。设计入参如下

代码语言:javascript复制
{
  "interfaceid":"16",  接口caseid
  "testid":"8",  #测试环境id
  "runcount":111, # 并发数
  "loopcount":999, #执行循环数
  "dbname":"test",  #数据名称
  "testserverid":1  #测试服务器id
  }

这个json格式的参数,我们到后台接受,处理即可。代码如下

代码语言:javascript复制
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打开的脚本是什么样子的,可以正常打开吗。

上述功能实现完毕,脚本可以正常打开,当然了,还要贴合我们的实际的项目呢,进行功能的调优。

还需要完成,脚本的复制,结果的收集的功能,后续将会持续分享,可以持续关注雷子说测试。

如果感觉有用,点亮在看

0 人点赞