博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台
阅读量:6449 次
发布时间:2019-06-23

本文共 6250 字,大约阅读时间需要 20 分钟。

**背景: 1.平时测试接口,总是现写代码,对测试用例的管理,以及测试报告的管理持久化做的不够,

2.工作中移动端开发和后端开发总是不能并行进行,需要一个mock的依赖来让他们并行开发。
3.同时让自己锻炼去开发测试平台,掌握flask开发程序,提高自己的业务水平。

整体思路: 1.利用flask+bootstrap来进行web界面开发,对接口,接口测试用例,定时任务,测试报告的持续集成。

2.IAPTest支持接口用例管理,接口多用例测试,支持定时测试任务,测试报告持久化
3.目前mock服务支持单一path,定时任务可以开启暂停多用例执行,定时任务执行后自动发送测试报告,多用例的单次执行,单接口的调试功能。对测试环境的管理
下面来看下最后的效果图,以及附上github开源地址。

测试环境管理界面:

flask + Python3 实现的的API自动化测试平台----  IAPTest接口测试平台

定时任务界面:

flask + Python3 实现的的API自动化测试平台----  IAPTest接口测试平台

mock界面

flask + Python3 实现的的API自动化测试平台----  IAPTest接口测试平台

测试报告界面

flask + Python3 实现的的API自动化测试平台----  IAPTest接口测试平台

用例管理界面

flask + Python3 实现的的API自动化测试平台----  IAPTest接口测试平台

接口管理界面

flask + Python3 实现的的API自动化测试平台----  IAPTest接口测试平台

核心代码分享区:

定时任务对应视图开发

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 - star
user_id = User.query.filter_by(role_id=2).first().id
new_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.headers
5 method=request.method
6 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 response
25 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 response
40 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 response
57 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 response
72 else:
73 return jsonify({'code': '-2', 'message': '你写入的类型目前系统不支持', 'data': ''}) #

开源地址:

使用说明:

1.依赖包为requirements.txt文件下的,可能部分不全,需要什么可以自己使用中增加。

2.目前由于考虑后续迁移内部使用的话,所以移除了注册功能,改为管理员后台添加方式,默认登录:liwanlei 密码:liwanlei
3.部分功能调试还存在一定的问题,欢迎各位多提宝贵意见,

部分功能欠缺:

1.定时任务的持久化,现在处理容易受到运行过程中的宕机等情况重新启动服务器的定时任务全部需要开启

2、mock接口只能支持单一的path

  1. 测试环境没有改为动态配置,动态支持。目前测试环境管理以及上线
    4。部分地方可能还会有不严谨性,但是工具可以使用。
    5、目前仅支持 http请求中的json格式的,
    6.大家可以多提意见,后续会优化,最近一直熬夜加班可能有些消息不能及时回复,还望谅解。

有问题可以联系我:QQ:952943386 email:leileili126@163.com qq群:194704520 新群:683894834

微信打赏

转载于:https://blog.51cto.com/lileilei/2043879

你可能感兴趣的文章
对软件工程课程的期望
查看>>
CPU高问题排查
查看>>
Mysql中文字符串提取datetime
查看>>
CentOS访问Windows共享文件夹的方法
查看>>
IOS 与ANDROID框架及应用开发模式对比一
查看>>
由中序遍历和后序遍历求前序遍历
查看>>
JQUERY Uploadify 3.1 C#使用案例
查看>>
coursera 北京大学 程序设计与算法 专项课程 完美覆盖
查看>>
firewall 端口转发
查看>>
wndows make images
查看>>
FS系统开发设计(思维导图)
查看>>
Computer Go Programming 学习
查看>>
我学习参考的网址
查看>>
婚姻 至理名言
查看>>
DEDE自带的采集功能,标题太短的解决方法
查看>>
easyui的combotree以及tree,c#后台异步加载的详细介绍
查看>>
C# string函数
查看>>
1、串(字符串)以及串的模式匹配算法
查看>>
正则表达式30分钟入门教程
查看>>
[原创]使用logcat快速抓取android崩溃日志
查看>>