本文共 6250 字,大约阅读时间需要 20 分钟。
**背景: 1.平时测试接口,总是现写代码,对测试用例的管理,以及测试报告的管理持久化做的不够,
2.工作中移动端开发和后端开发总是不能并行进行,需要一个mock的依赖来让他们并行开发。3.同时让自己锻炼去开发测试平台,掌握flask开发程序,提高自己的业务水平。整体思路: 1.利用flask+bootstrap来进行web界面开发,对接口,接口测试用例,定时任务,测试报告的持续集成。
2.IAPTest支持接口用例管理,接口多用例测试,支持定时测试任务,测试报告持久化3.目前mock服务支持单一path,定时任务可以开启暂停多用例执行,定时任务执行后自动发送测试报告,多用例的单次执行,单接口的调试功能。对测试环境的管理下面来看下最后的效果图,以及附上github开源地址。测试环境管理界面:
定时任务界面:
mock界面
测试报告界面
用例管理界面
接口管理界面
核心代码分享区:
定时任务对应视图开发
class AddtimingtaskView(MethodView):
定时任务所执行的func代码
def addtask(id):#定时任务执行的时候所用的函数
in_id=int(id)task=Task.query.filter_by(id=in_id).first()starttime = datetime.datetime.now()star = time.time()day = time.strftime("%Y%m%d%H%M", time.localtime(time.time()))basedir = os.path.abspath(os.path.dirname(file))file_dir = os.path.join(basedir, 'upload')file = os.path.join(file_dir, (day + '.log'))if os.path.exists(file) is False:os.system('touch %s' % file)filepath = os.path.join(file_dir, (day + '.html'))if os.path.exists(filepath) is False:os.system(r'touch %s' % filepath)projecct_list = []model_list = []Interface_name_list = []Interface_url_list = []Interface_meth_list = []Interface_pase_list = []Interface_assert_list = []Interface_headers_list = []id_list = []for task_yongli in task.interface.all():id_list.append(task_yongli.id)projecct_list.append(task_yongli.projects)model_list.append(task_yongli.models)Interface_url_list.append(task_yongli.Interface_url)Interface_name_list.append(task_yongli.Interface_name)Interface_meth_list.append(task_yongli.Interface_meth)Interface_pase_list.append(task_yongli.Interface_pase)Interface_assert_list.append(task_yongli.Interface_assert)Interface_headers_list.append(task_yongli.Interface_headers)apitest = ApiTestCase(Interface_url_list, Interface_meth_list, Interface_pase_list, Interface_assert_list, file,Interface_headers_list)result_toal, result_pass, result_fail, relusts, bask_list = apitest.testapi()endtime = datetime.datetime.now()end = time.time()createHtml(titles=u'接口测试报告', filepath=filepath, starttime=starttime, endtime=endtime, passge=result_pass,fail=result_fail, id=id_list, name=projecct_list, headers=Interface_headers_list,coneent=Interface_url_list, url=Interface_meth_list, meth=Interface_pase_list,yuqi=Interface_assert_list, json=bask_list, relusts=relusts)hour = end - staruser_id = User.query.filter_by(role_id=2).first().idnew_reust = TestResult(Test_user_id=user_id, test_num=result_toal, pass_num=result_pass, fail_num=result_fail,test_time=starttime, hour_time=hour, test_rep=(day + '.html'), test_log=(day + '.log'))email = EmailReport.query.filter_by(role_id=2, default_set=True).first()send_emails(sender=email.send_email, receivers=task.taskrepor_to, password=email.send_email_password,smtp=email.stmp_email, port=email.port, fujian1=file, fujian2=filepath, subject=u'%s自动用例执行测试报告' % day,url='%stest_rep'%(request.url_root))db.session.add(new_reust)db.session.commit()mock服务的一个请求方式的代码
1 class MakemockserverView(MethodView):#做一个mock服务
2 def get(self,path):#get请求方法3 huoqupath=Mockserver.query.filter_by(path=path,status=True).first()4 heders=request.headers5 method=request.method6 if not huoqupath:7 abort(404)8 if method.lower() !=huoqupath.methods:9 return jsonify({'code':'-1','message':'请求方式错误!','data':''})10 if huoqupath.is_headers==True:11 if comp_dict(heders,huoqupath.headers) ==True:12 if huoqupath.ischeck==True:13 paerm = request.values.to_dict()14 if dict_par(paerm,huoqupath.params)==True:15 if huoqupath.rebacktype == 'json':16 try:17 json_fan = json.dumps(huoqupath.fanhui)18 return jsonify({'code': '1', 'message': 'successs', 'data': json_fan})19 except:20 return jsonify({'code': '-2', 'message': '你写入的返回不能正常json!请检查', 'data': ''})21 elif huoqupath.rebacktype == 'xml':22 response = make_response(huoqupath.fanhui)23 response.content_type = 'application/xml'24 return response25 else:26 return jsonify({'code': '-2', 'message': '你写入的类型目前系统不支持', 'data': ''})27 else:28 return jsonify({'code': '-4', 'message': '你输入的参数不正确', 'data': ''})29 else:30 if huoqupath.rebacktype=='json':31 try:32 json_fan=json.dumps(huoqupath.fanhui)33 return jsonify({'code': '1', 'message': 'successs', 'data':json_fan})34 except:35 return jsonify({'code': '-2', 'message': '你写入的返回不能正常json!请检查', 'data': ''})36 elif huoqupath.rebacktype =='xml':37 response=make_response(huoqupath.fanhui)38 response.content_type='application/xml'39 return response40 else:41 return jsonify({'code': '-2', 'message': '你写入的类型目前系统不支持', 'data': ''})42 else:43 return jsonify({'code': '-3', 'message': '安全校验失败!', 'data': ''})44 if huoqupath.ischeck == True:45 paerm = request.values.to_dict()46 if dict_par(paerm, huoqupath.params) == True:47 if huoqupath.rebacktype == 'json':48 try:49 json_fan = json.dumps(huoqupath.fanhui)50 return jsonify({'code': '1', 'message': 'successs', 'data': json_fan})51 except:52 return jsonify({'code': '-2', 'message': '你写入的返回不能正常json!请检查', 'data': ''})53 elif huoqupath.rebacktype == 'xml':54 response = make_response(huoqupath.fanhui)55 response.content_type = 'application/xml'56 return response57 else:58 return jsonify({'code': '-2', 'message': '你写入的类型目前系统不支持', 'data': ''})59 else:60 return jsonify({'code': '-4', 'message': '你输入的参数不正确', 'data': ''})61 else:62 if huoqupath.rebacktype == 'json':63 try:64 json_fan = json.dumps(huoqupath.fanhui)65 return jsonify({'code': '1', 'message': 'successs', 'data': json_fan})66 except:67 return jsonify({'code': '-2', 'message': '你写入的返回不能正常json!请检查', 'data': ''})68 elif huoqupath.rebacktype == 'xml':69 response = make_response(huoqupath.fanhui)70 response.content_type = 'application/xml'71 return response72 else:73 return jsonify({'code': '-2', 'message': '你写入的类型目前系统不支持', 'data': ''}) #开源地址:
使用说明:
1.依赖包为requirements.txt文件下的,可能部分不全,需要什么可以自己使用中增加。
2.目前由于考虑后续迁移内部使用的话,所以移除了注册功能,改为管理员后台添加方式,默认登录:liwanlei 密码:liwanlei3.部分功能调试还存在一定的问题,欢迎各位多提宝贵意见,部分功能欠缺:
1.定时任务的持久化,现在处理容易受到运行过程中的宕机等情况重新启动服务器的定时任务全部需要开启
2、mock接口只能支持单一的path有问题可以联系我:QQ:952943386 email:leileili126@163.com qq群:194704520 新群:683894834
微信打赏
转载于:https://blog.51cto.com/lileilei/2043879