前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >测开技能--接口测试平台增加测试用例一键转化Jmeter

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

作者头像
雷子
发布2021-03-15 14:20:32
7740
发布2021-03-15 14:20:32
举报
文章被收录于专栏:雷子说测试开发

在之前的文章一文揭秘测试平台中是如何将测试用例一键转化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打开的脚本是什么样子的,可以正常打开吗。

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

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

如果感觉有用,点亮在看

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档