用Python的Requests库做接口测试
HTTP接口测试(基于Python Request)
一、POST方法:
(1)首先定义访问的url
url = host + "/xxx/interfaceName.json"
(2)传参
引用:(http://blog.csdn.net/mm_gg_201512/article/details/72830000)
application/x-www-form-urlencoded方式是Jquery的Ajax请求默认方式,这种方式的好处就是浏览器都支持,在请求发送过程中会对数据进行序列化处理,以键值对形式?key1=value1&key2=value2的方式发送到服务器,如果用Jquery,它内部已经进行了处理,如果自己写原生的Ajax请求,就需要自己对数据进行序列化。
application/json,随着json规范的越来越流行,并且浏览器支持程度原来越好,许多开发人员易application/json作为请求content-type,告诉服务器请求的主题内容是json格式的字符串,服务器端会对json字符串进行解析,这种方式的好处就是前端人员不需要关心数据结构的复杂度,只要是标准的json格式就能提交成功,application/json数据格式越来越得到开发人员的青睐。
如果是json方式传参:
header = {
'Content-Type':'application/json;charset=UTF-8'
}
payload = {
'paramName1': value1,
'paramName2': value2
}
ret = requests.post(url, data = json.dumps(payload), headers=header)
如果是x-www-form-urlencoded方式
header = {
'content-type': 'application/x-www-form-urlencoded'
}
payload = "paramName1=value1¶mName2=value2"
ret = requests.post(url, data = json.dumps(payload), headers=header)
二、Get方法:
(1)一样,首先定义访问的url
url = host + "/xxx/interfaceName.json"
(2)传参
params = {'paramName1':value1, 'paramName2':value2}
ret = requests.get(url, params=params)
三、设置cookie
有些系统的接口会需要在账号登录的情况下才能被调用,有些则不需要。如果遇到需要的,一个方法是通过获取已登录系统的cookie信息,通过request.get方法传入cookie信息,模拟已登录的状态。
myCookies = {'JSESSIONID':5a89c63e-6b25-4ca3-9082-a03xxxxxxxx}
ret = requests.xxx(url, ..., cookies=myCookies) //xxx表示get或post
多说一句,因为cookie会有有效期,如果失效了,就需要重新配置cookie。因此,我是在测试脚本运行刚开始,先调用某cookie对应的一个接口,如果返回异常,就停止测试脚本,给出提示让操作者重新配置cookie值。
四、获取返回值
ret = requests.xxx(url, ...)
对返回值,一般会用到返回码,以及返回数据
目前大多情况下,返回数据都是json格式的。对request.xxx返回的ret先转化为dict
ret_dict = dict(json.loads(ret.text,encoding='utf-8'))
然后再从dict中取code或者data
ret_code = ret_dict['code']
value = ret_dict['data']['paramName1']
对于返回码,多说两句。开发习惯不同,有些开发把返回200写成整型,有的写成字符型,
测试时,有的返回200,条件是ret_code=='200'成立,有的是 ret_code==200,
因此,不妨就统一写成:
if not(ret_code=='200' or ret_code==200):
print('[ERROR]:.........')
五、测试数据分离
测试脚本很常有的一个思想就是测试数据分离,就是将测试数据用txt/excel/csv格式进行存储,而不是放在代码中。
我用的是csv格式来存储,搭配Python中的csv库,来操作csv文件的读写。
读配置:
def getConfig(file, index):
file1 = open( file, 'rt')
reader = csv.reader(file1)
column = [row[index] for row in reader]
return column[0]
写配置:(我是把配置都写到csv第一行,第二行存各列的标题,第三行及以后存不同场景下的配置,根据需要把对应场景的配置写到csv的第一行,然后读取出来使用)
def write(type):
file2 = open( csv_file2, 'rt')
tempFile = open( temp_file, 'a+')
reader = csv.reader(file2)
writer = csv.writer(tempFile)
rows = [row for row in reader]
newData = rows[type]
i=0
for row in rows:
if i==0:
writer.writerow(newData)
六、Python调用jmeter
jmeter也可以拿来做接口测试,如果有需要混用的情况,下面介绍一下怎么调用jmeter。(什么时候会混用?比如别人用jmeter写的,我用python写的另外的,想结合起来一起用)
用到了Python的subprocess库
jmeter_bin="........."
jmx_folder = ".........."
exportCmd = "%s/jmeter -n -t %s -l %s" %(jmeter_bin,filefolder+"/xxxxxxx.jmx", jmx_folder+"/report.csv")
process = subprocess.Popen(exportCmd, shell=True)
(stdoutdata, stderrdata) = process.communicate()
在命令行下调用,命令是:
jmeter -n -t <testplan filename> -l <listener filename>