目录
1、接口自动化的意义(为何作这个框架)
2、准备工做
3、框架流程及逻辑
4、各模块介绍
5、具体使用
1、接口自动化的意义(为何作这个框架)
新版本上线时以前版本的功能须要进行回归测试,致使大量的重复性手工测试。引入自动化测试可使用自动化技术代替部分手工的回归性测试,解放更多人力作其它更有必要的事情。但目前项目UI变更频繁,而接口通常不会作大变更因此先暂时作接口自动化。使用接口自动化能够作上线前接口功能的回归性测试,也能够定时巡检线上环境接口的运行状况,能及时发现线上环境接口问题并解决。同时此框架能够帮助不会写代码的测试同事进行接口自动化的相关工做。
2、准备工做
开发语言:Python3
须要安装的模块:
Requests: python的一个HTTP客户端库,和urllib、urllib2相似。
一、安装方法:
使用pip安装
pip install Requests
或
python3 -m pip install Requests
下载源码后安装
git clone git://github.com/kennethreitz/requests.git
cd requests
python setup.py install
二、学习路径:
xlsxwriter :是python用来构造xlsx文件的模块,能够完成xlsx文件的自动化构造,包括:合并单元格,制做excel图表等功能。
一、安装方法:
使用pip安装
pip install Requests
或
python3 -m pip install Requests
二、学习路径:
3、框架流程及逻辑
框架理念:使用json文件编写测试用例,建一个脚本循环读取测试用例并执行,而后对比返回的接口和用例中的指望结果。将测试结果写入到一个excel表格中生成测试报告,最后使用发送邮件功能将测试报告发送到指定邮箱。其中对全部公共方法进行封装并放在common公共文件目录下。
4、各模块介绍
----interface_test 项目文件夹目录
----common 存放公共方法目录
----__init__.py 初始化文件
----conf.py 操做配置文件相关方法
----excelaction.py Excel文件相关操做方法
----jsonaction.py Json文件相关操做方法
----logger.py 记录日志的相关方法
----newfile.py 获取最新文件的相关方法
----sendmail.py 发送报告到指定邮箱的相关方法
----signture.py 对数据进行签名的相关方法
----userinfo.py 获取用户信息的相关方法
----config_test.conf 基本配置文件
----logs 存放日志的目录
----report 存放测试报告的目录
----test_data 存放测试用例数据的目录
----login-1.json 登陆接口的测试用例数据
----logout-2.json 退出登陆接口的测试用例数据
----execute_test.py 读取测试用例并执行测试用例
----test.bat 运行测试项目的批处理文件
execute_test.py 主要程序
1 #-*- coding: utf-8 -*-
2 #!/usr/bin/env python
3 importos4 importjson5 importrequests6 importcommon.conf as conf7 importcommon.excelaction as excelaction8 from common.sendemail importsendreport9 from common.signture importsign10 importcommon.userinfo as userinfo11 importcommon.logger as logger12 importsys13 importtime14
15 #data_path = os.path.dirname(__file__) + '\\test_data\\' # 测试用例数据文件所在目录
16 data_path =conf.testdata_path17
18 test_reports = [] #添加一个数组用来存储测试结果
19 for file in os.listdir(data_path): #循环读取目录下的文件
20 child = os.path.join('%s%s'%(data_path,file)) #将文件名和路径拼接好
21 logger.info("当前打开的文件:"+child)22 fl = open(child) #打开文件
23 try:24 cases =json.load(fl)25 for key in cases: #循环读取文件中的测试用例(case)
26 start_time =time.clock()27 case =cases[key]28 url = conf.get_conf('module',case['module']) + case['url']29 data = case['data']30 data['Platform'] = conf.get_conf('params','Platform')31 data['Terminal'] = conf.get_conf('params','Terminal')32 data['UserIP'] = conf.get_conf('params','UserIP')33 data['Version'] = conf.get_conf('params','Version')34 if "UserToken" in data and data['UserToken'] == '':35 data['UserToken'] =userinfo.get_token()36 hope_result = case['assert']37 method = case['method']38 test_report ={39 "case_id":case['id'],40 "t_name":case['name'],41 "method":method,42 "url":url,43 "params":data,44 "hope_result":hope_result,45 "actual_result":[],46 "test_result":""
47 }48 try:49 if method == 'post':50 addsign_data = sign(data,conf.get_conf('sign','api_key'))51 r = requests.post(url,data=json.dumps(addsign_data),headers=conf.header)52 response =r.json()53 s =True54 for k inhope_result:55 ar = str(k) + ":" +str(response[k])56 test_report["actual_result"].append(ar)57 if type(hope_result[k]) == type(''):58 if hope_result[k] inresponse[k]:59 s = s&True60 else:61 s = s&False62 else:63 if hope_result[k] ==response[k]:64 s = s&True65 else:66 s = s&False67 ifs:68 test_report["test_result"] = "PASS"
69 else:70 test_report["test_result"] = "Fail"
71
72 elif method == 'get':73 addsign_data = sign(data,conf.get_conf('sign','api_key'))74 r = requests.get(url,params=addsign_data,headers=conf.header)75 response =r.json()76 s =True77 for k inhope_result:78 ar = str(k) + ":" +str(response[k])79 test_report["actual_result"].append(ar)80 if type(hope_result[k]) == type(''):81 if hope_result[k] inresponse[k]:82 s = s&True83 else:84 s = s&False85 else:86 if hope_result[k] ==response[k]:87 s = s&True88 else:89 s = s&False90 ifs:91 test_report["test_result"] = "PASS"
92 else:93 test_report["test_result"] = "Fail"
94
95 else:96 print(u'暂不支持该请求方式')97 test_reports.append(test_report)98 end_time =time.clock()99 str_time = '当前执行的用例:' + key + '_'*4 + '用例执行所用时间:' + str(end_time- start_time) + 's'
100 logger.info(str_time)101 except:102 error_msg =sys.exc_info()103 logger.error(error_msg)104 continue
105 except:106 error_msg =sys.exc_info()107 logger.error(error_msg)108 continue
109
110 excelaction.creat_report(test_reports) #生成测试报告
111 sendreport() #发送测试报告
5、具体使用
一、在配置文件作对应项目的基础配置
[email] -- 邮箱相关配置
sender = ***@163.com -- 发件邮箱
receiver = ***@163.com -- 收件邮箱
smtpserver = smtp.163.com -- 发件邮箱服务器
username = ***@163.com -- 发件邮箱帐户名
password = **** -- 发件邮箱密码(用于第三方登陆的秘密)
[module] -- 模块相关接口域名配置
passport = http://passport.XXX.com/ -- 对应模块接口域名
[sign] -- 签名相关的配置
api_key = XXX-XXX -- 生成签名的key(填写项目对应的key)
[params] -- 接口参数配置(配置公共参数)
Platform = 1 -- 根据对应项目配置对应的公共参数和对应值
二、在test_data文件夹内用json文件写测试用例和对应参数
"case1":{"name":"登陆接口_测试正常登陆", --接口名称(或者接口简介)"module":"passport", --接口所属模块"url":"/api/Passport/Login", -- 接口地址(完整地址由模块对应域名+该地址拼接)"method":"post", --接口请求方式"id":"1-001", --用例ID"data":{ --接口请求参数(请求时由该参数加公共参数)"UserName":"XXX", --接口请求参数(根据具体接口补充,若是接口须要token则须要加token关键字(值为空就行),接口请求时会自动根据参数生成Sign,若是想本身定义则须要加Sign关键字(值填写本身定义的))
},"assert":{ --该条测试用例的断言条件"Status":200, --具体的断言条件,须要返回状态为200"Message":"登陆成功" --具体的断言条件
}
}
三、配置好基础配置和编写完测试用例后,运行项目中的test.bat文件。运行完成后会在report文件夹内生成测试报告文件,在logs文件夹内会生成测试运行过程当中的记录日志和报错日志(若是有)。