之前使用过urllib和urllib2做接口测试,在做的途中,感觉使用urllib2直接进行的get,post 请求并没有那么好用。作为测试人员,所需要的测试工具应当以方便为第一要务,测试的耗时只要是真正的无人值守,耗时不是太久的都可以接受。所以,本人又尝试了一个新的包:requests。  

  Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3 !推荐一篇文章,上面有该包的详细说明 传送门,以下只会写到我用到的部分,所以更多的了解需要自己去搜资料

  好了,我们开始吧!!

  接口测试中重要的部分:

   1.get和post方法

     2.用到的参数

     3.请求头

     4.cookie

     5.日志输出

     6.如何调试你的程序--借助fiddler

  按照以上的顺序,我将一一说明我的搞法,因为编码能力有限,所以可能看着很low

一、get和post

  requests包很好的实现了post和get方法,示例:

 import requests
response_get = requests.get(url, data, headers, cookies)
response_post = requests.post(url, data, headers, cookies)

  其他的访问方式如put,head等等,用法几乎都是如此,因为没用到,所以省略

  现在一般的接口返回值有页面和json俩种,按照需求,可以分别使用response.text或者response.content获取,text获取的是unicode类型的返回值,而content返回值是str类型,所以我一般使用content来获取返回值,因为这样获取的返回值可以直接使用正则或者in的方式来验证返回值结果是否正确。

我自己为了实现接口的自动访问,所以又在requests上面加了一层封装,就像下面这样:

 def main_get(list_result, cookies):
"""
用于模拟get请求,返回结果
:param list_result:空列表,用于存储结果
:param cookies: 登陆后的cookie
:return:访问结果
"""
# List_interface_get写在接口文件里,文件是py格式,然而它本身是字典类型
for key in List_interface_get:
try:
f1 = requests.get(key, cookies=cookies)
if f1:
print f1.content
print List_interface_get[key]+'接口访问成功'
split_line()
list_result.append(f1.content+'||'+key)
# print f1.read()
except AssertionError:
print 'One Error in get'
pass
return list_result def main_post(result_list, url_list, param_list, payload_list, note_list, cookies):
"""
模拟post请求
:param result_list: 结果字典
:param url_list: 接口字典
:param param_list: 入参字典
:param payload_list: header字典
:param notelist: 描述字典
:param cookies: 登录获取的cookie
:return:填充完成的结果列表
""" # post这块写的比较low,最好自己搞一个数据结构把它搞定
for key in range(1, 9):
a = requests.post(url=url_list[key], data=param_list[key], headers=payload_list[key], cookies=cookies)
try:
if a.content:
print a.content
print note_list[key]+'接口访问成功'
split_line()
result_list.append(a.content+'||'+url_list[key])
except AssertionError:
print 'One Error in post'
pass
return result_list

二、用到的参数以及请求头

  我用的方法是把这些都存放于一个py文件中,当然也可以使用excel或者xml文件,甚至于使用DB。项目紧急,凑合了一下,这里的数据结构主要为了符合上面封装的函数,直接上代码看吧

 BaseURL = 'https://******.com'  # 测试环境
# 使用什么数据结构不重要,关键看实现方法中怎么解析你的测试数据
List_interface_get = {
BaseURL+'/api/****/****/****?****=1&****=375': '描述'
}
# 以下是用于post的接口
List_interface_post = {
1: BaseURL+'/api/****/****/****/****'
}
# 以下是用于post的数据
List_post_param = {
1: 'new=222222&old=111111'
}
# 以下是post接口的描述,它是干嘛的
List_post_note = {
1: '修改密码'
}
# 以下是post用到的请求头
List_post_header= {
1: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
}

  三、cookie

  一款产品的接口测试中必定会使用登录状态,需要使用cookie实现,之前写过使用cookiejar获取cookie,requests中获取cookie的方法更为简单,不过首先你得知道是哪个接口set了cookie,不过一般是登录啦。登录接口访问之后set了cookie,那好,就去调用登录接口,然后拿到搞回来的cookie:

# 只需要这样!!
login = requests.post(login_url, data=login_data, headers=login_header)
cookie = login.cookies

这个cookie就是登录状态了,拿着随便用,需要登录的就直接cookies=cookies

四、日志输出

  这里注意看第二步中接口数据,有接口描述,也有接口是啥,第一步中又把content做成返回值了,具体拼接方式自己想吧,东西全有了,想写啥写啥,还可以加上获取本地时间的api获取接口运行时间,log文件该长啥样是门学问,这里就不献丑了。

   五、借用fiddler调试你的脚本

requests允许使用代理访问,这有啥用,真有!fiddler是一款截包改包的工具,而且通过扩展可以进行请求间的比对,这样让你的程序访问的请求和真正正确的请求作对比,为啥我的程序访问出错?是不是缺了请求头?参数是不是丢了?cookie是不是少了?很容易看出来。写法如下:

proxies = {
"http": "http://127.0.0.1:8888",
"https": "http://127.0.0.1:8888"
}
requests.post(url, proxies=proxies)

这样就可以走代理了,除fiddler以外还有charles和burp suite可以使用,具体看个人喜好吧。

                                                           好了,就这样,菜鸟一枚,欢迎指正

-------首席小学生

使用python进行接口测试(二)的更多相关文章

  1. 基于python的接口测试框架设计(二)配置一些参数及文件

    基于python的接口测试框架设计(二)配置一些参数及文件 我这里需要基于我的项目配置的主要是登陆参数.以及baseURL ,把这些放在单独的文件里  毕竟导入的时候方便了一些 首先是url 图略 建 ...

  2. Python之接口测试(一)

    前言 之前我们已经学会了利用JMeter工具进行接口测试,今天我们学习一下如何利用python进行接口测试. 一:发送get请求 import requests,json url = 'http:// ...

  3. python排序之二冒泡排序法

    python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...

  4. Python 基础语法(二)

    Python 基础语法(二) --------------------------------------------接 Python 基础语法(一) ------------------------ ...

  5. Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识

    Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...

  6. 初学 Python(十二)——高阶函数

    初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 ...

  7. python/MySQL练习题(二)

    python/MySQL练习题(二) 查询各科成绩前三名的记录:(不考虑成绩并列情况) select score.sid,score.course_id,score.num,T.first_num,T ...

  8. Python/MySQL(二、表操作以及连接)

    Python/MySQL(二.表操作以及连接) mysql表操作: 主键:一个表只能有一个主键.主键可以由多列组成. 外键 :可以进行联合外键,操作. mysql> create table y ...

  9. python下实现二叉堆以及堆排序

    python下实现二叉堆以及堆排序 堆是一种特殊的树形结构, 堆中的数据存储满足一定的堆序.堆排序是一种选择排序, 其算法复杂度, 时间复杂度相对于其他的排序算法都有很大的优势. 堆分为大头堆和小头堆 ...

  10. python函数(二)

    python函数(二) 变量的作用域 1.局部变量与全局变量 在函数内创建的变量被称为局部变量,这类变量的生命周期与函数相同,当函数执行完毕时,变量也就随之消失. 此类变量只能在函数内部调用,函数外不 ...

随机推荐

  1. vipw和vigr命令

    Modifying the Configuration Files To add user accounts, it suffices that one line is added to /etc/p ...

  2. python 整型--《Python 3程序开发指南》笔记

    参考:<Python 3程序开发指南> 整数转换函数: bin(i) 返回整数i的二进制表示(字符串) hex(i) 返回i的十六进制表示(字符串) int(x) 将x转换为整数,失败产生 ...

  3. 组合控件 圆环 ring

    使用 可以设置内部填充样式及大小 可以设置边框颜色及宽度 这里只是介绍了其中一种实现方式,其实这种类型的东西完全可以用自定义View去实现,他就是一个空中的大圆+一个空中或实心的小圆,实现起来也是非常 ...

  4. Vitamio VideoView 示例

    VideoView 播放本地视频 /**  * 会根据视频尺寸自动缩放  * 自己对VideoView设置的宽高基本不起任何作用  */ public class VideoViewDemo exte ...

  5. asp.net设置元素css的属性

    controls.style.Add("css名称","css值") 添加class规则 control.cssclass="str_cssname& ...

  6. NPOI控件的使用导出excel文件和word文件

    public HttpResponseMessage GetReportRateOutput(DateTime? begin_time = null, DateTime? end_time = nul ...

  7. 重学《C#高级编程》(对象与类型)

    昨天重看了下<C#高级编程>里面的对象与类型一章,发现自己有许多遗漏没懂的地方重新弄清楚明白了 先说说什么是对象吧,我个人的感觉是:在编程的世界里,一段程序就是一个事物的处理逻辑,而对象就 ...

  8. Android弹性ScrollView

    开袋即食 import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; ...

  9. vsftp的设置选项

    设置匿名用户上传的文件的权限: anon_umask=  匿名用户新增文件的umask 数值.默认值为077.     VSFTPD的设置选项 VSFTPD的配置文件/etc/vsftpd/vsftp ...

  10. c++中 cin、cin.get()、cin.getline()、cin.getchar()的区别

    ①cin>>:无法接收空格.Tap键且以空格.Tap键.回车符为分隔符: ②cin.get( ):可以接收空格.Tap键且以回车符为结束符: 一:可输入单个字符 格式: char ch; ...