基于Flask+vue框架快速构建测试工具
我们做黑盒测试的同学,在没有自动化的条件下,遇到过这些烦恼:
1、辛辛苦苦构造了一波数据,测完一轮后,回归测试发现数据损坏
2、为了测通这条用例,需要一波猛操作调用多个依赖API做好场景
3、各种批量处理,比如给我这100个测试账户加10个亿资产
4、……
面对上述问题,初期咱们可以写好DML脚本、在postman录好依赖接口的用例等等,需要的时候「一键执行」。好吧,如果这些情况非常多,你要连接n个库、管理n个依赖接口的时候,事情就没那么「一键」了。
前面举例的场景简单的涉及了两类需求:调API、跑数据库脚本。Python的pymysql、request库就能够完成,可以说走到这一步已经比较省事了。如果能更进一步呢,咱们试试Flask,分类把这些协助测试的操作封装成一个个web接口,让测试同学执行用例前回车一下URL就好。
Flask作为Python轻量级的web应用程序框架,深受初入web开发和测试同学的喜爱,一个字「轻」!网上有很多讲解这里就不粘贴了。简单聊聊我们用它做了什么。
01
Flask框架搭建
简单地理一下思路:
Flask服务搭起来:
import logging, linecache, flask, json, osfrom logging import getLoggerfrom logging.handlers import RotatingFileHandlerfrom flask import request, jsonify, Flask, render_templateserver = flask.Flask(__name__, template_folder="testman", static_folder="testman")log = getLogger(__name__)current_dir = os.path.dirname(os.path.abspath(__file__))#testhome前端页面资源def testman():return render_template("index.html")#api_sce,api测试场景构造(api_scripts/env路径下),用例调用,必传参数:env-测试环境、pyname-脚本名称def api_sce():pyname = request.values.get('pyname')env = request.values.get('env')py_path = current_dir + '\\api_scripts\\' + env + '\\'import syssys.path.append(py_path)find = os.path.exists(py_path + pyname + '.py')if find == False:resu_err = {'code': 1, 'message': '没有找到模块: ' + pyname + '.py'}return jsonify(resu_err)else:try:import importlibpy_model = __import__(pyname)importlib.reload(py_model)fun_ = getattr(py_model, pyname)data = fun_(env)print("返回的data:{}".format(data))except Exception as e:print(e)data = str(e)resu = {'code': 0, 'message': '执行模块:' + pyname + '.py' + ' 成功!', 'data': data}return jsonify(resu)
从简短的示例可以看到,这里一个python模块可以封装多个API,你可以定义不同API来实现不同的测试工具,也可以大统一1个API去调用指定路径下的指定python模块。我们使用了后者,通过Flask接口的入参pyname找到对应的.py处理模块并调用,好处在于(1)构建测试工具的同学不用关心框架,直接输出自己的.py模块就好;(2)不用每次修改或新增工具时修改Flask;
        然后通过浏览器访问工具一键处理测试场景:
http://url/api_sce?env=env&pyname=pyname
02
嵌入vue
        欲求不满的测试同学应该会想进一步界面化工具,vue搞起来:
<body>:
<h2>选择环境</h2><el-radio @change="api_showpy_run" label="sit" v-model="env">sit</el-radio><el-radio @change="api_showpy_run" label="uat" v-model="env">uat</el-radio><el-radio @change="api_showpy_run" label="dev" v-model="env">dev</el-radio><el-radio @change="api_showpy_run" label="pet" v-model="env">pet</el-radio><br><h2>选择脚本</h2><!-- 下拉框取pynames --><el-select v-model="selected" filterable aria-placeholder="请选择"><el-optionv-for="item in pynames":label=item:value=item></option></el-select><br><!-- 执行选中的python脚本,调用api_sce_run --><el-button type="primary" @click="api_sce_run">执行</el-button> <br><br>执行结果:<pre>{{result}}</pre>
<script>:
methods:{// api_sce_run用于执行选中的脚本api_sce_run(){if (this.env == '') {this.$message({message:'请选择测试环境!',type:'warning'})// alert('请选择测试环境!')pass}if (this.selected == '') {this.$message({message:'请选择脚本!',type:'warning'})// alert('请选择脚本!')pass}this.$message({message:'提交成功,请耐心等待!',type:'success'});axios.get(this.url+'/api_sce?'+'env='+this.env+'&pyname='+this.selected).then(response => (this.result = response.data))},// api_showpy_run用于查询当前环境路径下可执行的所有脚本文件,输出列表api_showpy_run(){this.selected = ''this.result = ''axios.get(this.url+'/api_showpy?'+'env='+this.env).then(response => (this.pynames = response.data))},}
<界面>:
这样,我们可以减少在回归测试阶段场景构建的重复投入,非测试人员使用时也无需测试人员介入,比如产品走差、开发自测,可以直接界面操作生成测试场景。测试同学可以更专注于用例设计开发和测试执行。
