接口自动化框架-随便写的,不要喷哈
前几天开始自己学习整理一个接口自动化框架,就在网上查了下,然后根据自己的理解和经验写了一个简陋版,这里和大家分享下,如果有不合理的地方,那是肯定的,所以大家就看看鄙人的思路,不要太较真,有好的建议什么的麻烦提给我,一起进步。
因为本人目前就对python有一定的了解,java早都忘了,所以本次使用python+unittest+ddt+BeautifulReport来完成这个任务。
下面,我要开始表演了……
大纲
个人理解,一个接口自动化框架,应该包括以下内容:
- 用例管理-本次使用Excel表格进行管理;
- 脚本用例管理;
- 获取Excel表格用例,并发起请求;
- 获取请求结果,进行断言校验;
- 日志打印;
- 发送结果邮件;
用例管理
目前因为是自己写的简陋版,所以没有做的那么完美,只是对基本的信息进行处理,其实其他的同理添加即可,后续我把它补足。
先来看看我的excel中保存了那些内容:
用例编号、名称没有什么好解释的;
请求方法:本次只针对https/http协议的请求,填写对应的http请求方法,get、post、delete等等;
请求URL:……
请求参数:F12查看正常发送的参数,或者按照接口文档自己组织,不过有个问题,可能在请求参数中是嵌套字典或列表,需要做下特殊处理,我这里把列表内容先当作字符串处理
{‘puid’: 34, ‘requestType’: ‘coverSweepReceiverApp’, ‘sendtype’: ‘C2B码申请’, ‘sendData’:’[{“fid”:523,“keyword”:“issCode”,“value”:“90880019”},{“fid”:525,“keyword”:“backUrl”,“value”:“http://101.231.204.84:8091/sim/notify_url2.jsp”},{“fid”:526,“keyword”:“qrType”,“value”:""},{“fid”:527,“keyword”:“reqAddnData”,“value”:""},{“fid”:646,“keyword”:“emvCodeIn”,“value”:""},{“fid”:528,“keyword”:“accNo”,“value”:“6216261000000002485”},{“fid”:529,“keyword”:“name”,“value”:“宋小”}]’}
注意:斜体部分,在正常的请求中属于列表,但是如果原样填写到excel中,发送get请求时组织的url不对,可能是我学艺不精,哪位大哥知道有更好的处理方法,麻烦告知一下。
后置处理器:后置处理器,就是在请求完成后,获取请求响应中的部分字段,供后续用例使用或其他后续操作,这里按照固定格式上送。
${qrNo}=[qrNo],或${qrNo}=[qrNo][0][data]
结果断言:就是将需要检查的字段组织填写。
还有前置处理器、数据库查询没有处理,后面再搞。
脚本用例管理
这里使用unittest+ddt处理,分下面几步:
- 读取excel表中关联的用例和相关字段(后续步骤介绍)
- 获取全局变量参数,对请求参数中的参数进行替换
- 发起http请求(后续步骤介绍)
- 后置处理器处理,将后置处理器字段的内容保存到全局变量参数中
- 断言结果校验
参数变量替换:
在本文中,全局参数变量保存如下格式:'${qrNo}': '6221364343281898240'
python中全局变量跨文件使用还是有些特别,我首先使用一个文件保存全局变量:
# GlobalVars.py
def _init():
global _correlationDict
_correlationDict = {}
def set_value(key, value):
_correlationDict[key] = value
def get_value(key):
try:
return _correlationDict[key]
except KeyError:
return None
def get_values():
'''
:return: 返回整个字典值
'''
return _correlationDict
后续使用之前,首先要调用_init()进行初始化。
获取到全局变量后,进行参数替换:
correlationDict = gv.get_values()
for key in correlationDict:
if key in params:
params = params.replace(key, correlationDict[key])
后置处理器处理,将后置处理器中的参数保存到全局变量中,放到unittest的tearDown()中进行处理。
${qrNo}=[qrNo],或${qrNo}=[qrNo][0][data]
后置处理文件有如上两种格式,什么意思呢,因为响应的内容可能是简单的dict格式,但也有嵌套的形式,所以单独进行处理了。
def tearDown(self):
if self.tear_down is None:
return
tear_down_list = self.tear_down.split(';')
for tdl in tear_down_list:
param = tdl.split('=')
values = self.result
if param[1].count(']') == 1:
gv.set_value(param[0], values[param[1][1:-1]])
else:
for key in param[1][1:-1].split(']['):
try:
tmp = values[int(key)]
except:
try:
tmp = values[key]
except:
break
values = tmp
gv.set_value(param[0], values)
用例管理的主要内容就讲解完了,下一篇文章我再分析下后续的内容,发送请求、断言校验、Log模块、发送邮件。