python接口自动化?自动化测试框架
大家好,今天来为大家分享python接口自动化的一些知识点,和自动化测试框架的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
使用python做接口自动化测试容易吗
为什么要做接口自动化测试?
在当前互联网产品迭代频繁的背景下,回归测试的时间越来越少,很难在每个迭代都对所有功能做完整回归。但接口自动化测试因其实现简单、维护成本低,容易提高覆盖率等特点,越来越受重视。
为什么要自己写框架呢?
使用Postman调试通过过直接可以获取接口测试的基本代码,结合使用requets+ unittest很容易实现接口自动化测试的封装,而且requests的api已经非常人性化,非常简单,但通过封装以后(特别是针对公司内特定接口),可以进一步提高脚本编写效率。
一个现有的简单接口例子
下面使用requests+ unittest测试一个查询接口
接口信息如下
请求信息:
Method:POST
URL:api/match/image/getjson
Request:
{
"category":"image",
"offset":"0",
"limit":"30",
"sourceId":"0",
"metaTitle":"",
"metaId":"0",
"classify":"unclassify",
"startTime":"",
"endTime":"",
"createStart":"",
"createEnd":"",
"sourceType":"",
"isTracking":"true",
"metaGroup":"",
"companyId":"0",
"lastDays":"1",
"author":""
}
Response示例:
{
"timestamp": xxx,
"errorMsg":"",
"data":{
"config": xxx
}
Postman测试方法见截图:
测试思路
1.获取Postman原始脚本
2.使用requests库模拟发送HTTP请求**
3.对原始脚本进行基础改造**
4.使用python标准库里unittest写测试case**
原始脚本实现
未优化
该代码只是简单的一次调用,而且返回的结果太多,很多返回信息暂时没用,示例代码如下
import requests
url=""
querystring={"category":"image","offset":"0","limit":"30","sourceId":"0","metaTitle":"","metaId":"0","classify":"unclassify","startTime":"","endTime":"","createStart":"","createEnd":"","sourceType":"","isTracking":"true","metaGroup":"","companyId":"0","lastDays":"1","author":""}
headers={'cache-control':"no-cache",'postman-token':"e97a99b0-424b-b2a5-7602-22cd50223c15"
}
response= requests.request("POST", url, headers=headers, params=querystring)
print(response.text)
优化第一版
调整代码结构,输出结果Json出来,获取需要验证的response.status_code,以及获取结果校验需要用到的results['total']
#!/usr/bin/env python#coding: utf-8'''
unittest merchant backgroud interface
@author: zhang_jin
@version: 1.0
@see:
'''import unittestimport jsonimport tracebackimport requests
url=""
querystring={"category":"image","offset":"0","limit":"30","sourceId":"0","metaTitle":"","metaId":"0","classify":"unclassify","startTime":"","endTime":"","createStart":"","createEnd":"","sourceType":"","isTracking":"true","metaGroup":"","companyId":"0","lastDays":"1","author":""
}
headers={'cache-control':"no-cache",'postman-token':"e97a99b0-424b-b2a5-7602-22cd50223c15"
}#Post接口调用
response= requests.request("POST", url, headers=headers, params=querystring)#对返回结果进行转义成json串
results= json.loads(response.text)#获取http请求的status_codeprint"Http code:",response.status_code#获取结果中的total的值print results['total']#print(response.text)
优化第二版
接口调用异常处理,增加try,except处理,对于返回response.status_code,返回200进行结果比对,不是200数据异常信息。
#!/usr/bin/env python#coding: utf-8'''
unittest merchant backgroud interface
@author: zhang_jin
@version: 1.0
@see:
'''import jsonimport tracebackimport requests
url=""
querystring={"category":"image","offset":"0","limit":"30","sourceId":"0","metaTitle":"","metaId":"0","classify":"unclassify","startTime":"","endTime":"","createStart":"","createEnd":"","sourceType":"","isTracking":"true","metaGroup":"","companyId":"0","lastDays":"1","author":""
}
headers={'cache-control':"no-cache",'postman-token':"e97a99b0-424b-b2a5-7602-22cd50223c15"
}try:#Post接口调用
response= requests.request("POST", url, headers=headers, params=querystring)#对http返回值进行判断,对于200做基本校验 if response.status_code== 200:
results= json.loads(response.text) if results['total']== 191: print"Success" else: print"Fail" print results['total'] else:#对于http返回非200的code,输出相应的code raise Exception("http error info:%s"%response.status_code)except:
traceback.print_exc()
python接口自动化之token登录
前言
有些登录不是用cookie来验证的,是用token参数来判断是否登录。
token传参有两种一种是放在请求头里,本质上是跟cookie是一样的,只是换个单词而已;另外一种是在url请求参数里,这种更直观。
一、登录返回token
1.如下图的这个登录,无cookies
2.但是登录成功后有返回token
二、请求头带token
1.登录成功后继续操作其它页面,发现post请求的请求头,都会带token参数
2.这种请求其实比cookie更简单,直接把登录后的token放到头部就行
三、token关联
1.用脚本实现登录,获取token参数,获取后传参到请求头就可以了
2.如果登录有验证码,前面的脚本登录步骤就省略了,自己手动登录后获取token
import requests
header={#登录抓包获取的头部
"User-Agent":"Mozilla/5.0(Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
"Accept":"/",
"Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding":"gzip, deflate",
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With":"XMLHttpRequest",
"Content-Length":"423",
"Connection":"keep-alive"
}
body={"key1":"value1",
"key2":"value2"}#这里账号密码就是抓包的数据
s= requests.session()
login_url=" "#自己找带token网址
login_ret= s.post(login_url, headers=header, data=body)
token= login_ret.json()["token"]
post_url=" "
header["token"]= token
header["Content-Length"]="9"
body1={
"key":"value"
}
post_ret= s.post(post_url, headers=header, data=body1)
print post_ret.content
python自动化测试怎么将多个依赖数据
接口测试中,有些场景接口间存在着数据依赖的问题,比如说提交订单前需要用户先登录等等,下面就用两个小案例说说数据依赖的问题。
两个接口,一个接口(project_add)用来创建测试项目,一个接口(env_add)用来创建测试环境,env_add接口需依赖project_add接口返回的project_id字段数据。
一、Postman解决数据依赖的问题
第一步,project_add接口,Tests中写js代码,将需依赖的字段添加到环境变量中
第二步:在env_add接口的Pre-request Script中写js代码,把第一个接口拿到的参数赋值
第三步:再将project_id配置到Body中prj_id字段中
这样数据依赖的问题就搞定了
二、用python代码实现接口数据依赖
用代码解决数据依赖的方法有多种,下面用反射来解决数据依赖的问题。
反射它可以把字符串映射到实例的变量或者实例的方法然后,可以去执行调用、修改等操作。
它有四个重要的方法:
getattr获取指定字符串名称的对象属性
setattr为对象设置一个对象
hasattr判断对象是否有对应的对象(字符串)
delattr删除指定属性
classRelyData(object):
project_id=Noneprint(RelyData.project_id)
setattr(RelyData,"project_id","111")print(getattr(RelyData,"project_id"))
定义了一个RelyData()类,里面设置了一个类属性,project_id=None,然后再用setattr函数为对象RelyData里面project_id属性设置了新值,最后再用getattr函数取出里面的值,这是个属性值替换的过程。
classTest(unittest.TestCase):defsetUp(self):pass
deftest_1(self):"""添加项目接口"""url=
""headers={'Content-Type':
'application/x-www-form-urlencoded'}
datas={"prj_name":"baidu search","description":"百度搜索"}
response= requests.post(url, data=datas, headers=headers)print("response:", response.json())
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!