学习了一段时间接口自动化,总算有点新的认识,但是学到的没能全理解,只能先把代码摆这。(不知道这个标题这么写是不是合适。)
之前自动化只认识unittest框架,最后生成一个html的测试报告。虽然也强行做到了类似于参数化的效果,从excel读取数据,但是感觉很不方便,生成的报告不符合心愿。现在课程已经学了一半,已经做到了从excel读数据,最后生成excel的测试报告的效果。(感觉还是jmeter方便,省得写那么多代码,excel测试数据准备方面一样麻烦,只是jmeter不能生成excel报告。)
首先这里出现一个新包:urllib3,下面是百度到的一段,没太理解怎么回事,在接口自动化这里,好像是做https协议的接口测试时候,免去工作台中输出警告。
Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库。许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库urllib里所没有的重要特性:
- 线程安全
- 连接池
- 客户端SSL/TLS验证
- 文件分部编码上传
- 协助处理重复请求和HTTP重定位
- 支持压缩编码
- 支持HTTP和SOCKS代理
pip install urllib3就可以安装,具体不详细介绍了。
下面说一下封装的东西。
接口测试一般需要url,参数,可能有的要请求头,之后返回请求结果。还要有断言判断是不是想要的返回结果。这些都可以封装起来,提供后面使用。先上代码。
这个python文档命名TestRequest.py,后面再写的时候附带的代码会调用这个模块,所以会出现这个名字。
import json
import requests
import urllib3
urllib3.disable_warnings()
requests.packages.urllib3.disable_warnings()
#添加一个数组,用来装测试结果
hlist=[]
#公共的头文件设置
header={
'content-type': "application/json;charset=UTF-8"
}
def TestPostRequest(hurl,hdata,headers,htestcaseid,htestcasename,htesthope,fanhuitesthope):
hr=requests.post(hurl,data=hdata,headers=headers)
hresult=json.loads(hr.text)
hstatus=hresult['status']
if hstatus==htesthope and fanhuitesthope in str(hresult):
hhhdata={'t_id':htestcaseid,
't_name':htestcasename,
't_method':'POST',
't_url':hurl,
't_param':'测试数据:'+str(hdata),
't_hope':'status:'+htesthope+',期望结果:'+fanhuitesthope,
't_actual': 'status:' + hstatus + ',实际返回结果:' + str(hresult),
't_result':'通过'
}
hlist.append(hhhdata)
else:
hhhdata = {'t_id': htestcaseid,
't_name': htestcasename,
't_method': 'POST',
't_url': hurl,
't_param': '测试数据:' + str(hdata),
't_hope': 'status:' + htesthope + ',期望结果:' + fanhuitesthope,
't_actual': 'status:' + hstatus + ',实际返回结果:' + str(hresult),
't_result': '失败'
}
hlist.append(hhhdata)
print(hlist)
def TestGetRequest(hurl,hdata,headers,htestcaseid,htestcasename,htesthope,fanhuitesthope):
if hdata=='':
hr=requests.get(hurl,headers=headers)
else:
hr=requests.get(hurl,params=hdata,headers=headers)
hresult=json.loads(hr.text)
hstatus=hresult['status']
if hstatus==htesthope and fanhuitesthope in str(hresult):
hhhdata={'t_id':htestcaseid,
't_name':htestcasename,
't_method':'GET',
't_url':hurl,
't_param':'测试数据:'+str(hdata),
't_hope':'status:'+htesthope+'期望结果:'+fanhuitesthope,
't_actual': 'status:' + hstatus + '实际返回结果:' + str(hresult),
't_result':'通过'
}
hlist.append(hhhdata)
else:
hhhdata = {'t_id': htestcaseid,
't_name': htestcasename,
't_method': 'GET',
't_url': hurl,
't_param': '测试数据:' + str(hdata),
't_hope': 'status:' + htesthope + '期望结果:' + fanhuitesthope,
't_actual': 'status:' + hstatus + '实际返回结果:' + str(hresult),
't_result': '失败'
}
hlist.append(hhhdata)
print(hlist)
这里封装了两个,get请求和post请求,我觉得这俩都差不多,好像post也能办了get的事,别处调用的时候,写清具体调用哪个就可以了,如果还要delete请求或者别的,就在这个模块继续加,我只接触过这两个请求。
代码中黄色字部分,是别处调用时候传的值。分别是url,参数,请求头,用例id,用例名称,期望返回状态码,期望返回结果。根据自己情况可以添加或删除部分值,比如不要用例id。
hresult=json.loads(hr.text)这意思是把返回结果的json格式转换为字典格式。下面从返回结果取出返回状态吗。
if和else分支,这相当于断言,判断返回状态码和期望返回状态吗是否相等,期望返回结果是不是返回结果的一部分。
hhhdata里面的东西都是打印出来的,想要打印什么样子也可以自己定,比如蓝色get和post那,那一行都没什么实际用途。
最后把hhhdata写进hlist列表里,输出hlist列表内容。
封装到这就结束了,本来想写一个测试这封装的脚本,暂时没合适的接口,就先写到这里。
如果传参是json格式的,也可以再封装一个先把参数转换的方法,免去以后别处调用的时候,调用那里再转换了。