接口测试的原理就是模拟客户端向服务器发送请求,服务器接收请求报文后对相应的报文做处理并向客户端返回应答,客户端接收应答的过程。
接口测试采用的方法其实与黑盒测试一致的,甚至可以把接口测试理解为没有界面的功能测试。只不过接口测试的关注点主要在请求和响应上。另外,还包括接口的安全,接口的性能等。常用的用例设计有等价类,边界值法等。
一般测试用例的设计要从单接口参数的校验到整个业务功能点的验证,还可以验证一些安全性和异常情况。
为什么我们需要关心接口返回的响应值
原因:我们需要对返回的响应内容进行断言,从而验证接口工作是否正常。
接口响应内容的形式?
主要有三种形式:JSON格式的字符串;HTML源码;程序员自定义的字符串。
主要的处理方式?
处理方式1:正则表达式来进行处理,这种方法适合以上三种响应内容形式。
处理方式2:lxml库进行处理,这种方式仅针对返回内容是HTML源码形式的。
处理方式3:直接使用requests库自带的json方法进行处理,这种方式仅针对返回内容是json形式的。
正则表达式
获取指定内容最常用的一个正则表达式.*?的使用。
状态码 | 含义 |
---|---|
1** | 临时响应并需要请求者继续执行操作 |
2** | 请求成功。操作被成功接收并处理 |
3** | 重定向代码,用于已经移动的文件并且在头信息中指定新的地址信息 |
4** | 客户端错误,请求包含语法错误或者无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生错误 |
比如:
200 服务器成功处理请求
404 未找到资源
410 找到资源,但现在已不存在
500 内部服务器错误
503 服务器目前无法为请求提高服务
302 临时重定向
304 客户端的缓存资源时最新的,要客户端使用缓存
DNS:Domain Name Server 域名服务器
http:// www.baidu.com: 80/ adv_search? w=py&order=false# tag
HTTP报文格式分为两种
请求报文:请求行,请求头部,回车换行,消息体
响应报文:状态行,响应头部,回车换行,消息体
HTTP由请求和响应构成,是一个标准的客户端服务器模型(B/S架构)。HTTP协议永远都是客户端发起请求,服务器回送响应。B/S架构又叫浏览器/服务器模型,严格意义上说,这个B不仅仅只是浏览器,凡是能够发生HTTP请求的对象或者工具,都可以叫做客户端。
URL地址,请求参数(可选),请求头,请求体(仅限POST请求)
对于响应内容部分,主要关注两个点:响应状态码,响应内容
HTTP工作过程
Get和Post
Get:从服务器端获取资源或数据
Post:向服务器端提交数据
Get和Post的区别:
1)Get请求一般用于向服务器请求获取一个资源,没有副作用,一般会在客户端做缓存。Post请求一般用于向服务器提交数据并让其去完成一件事,所以这个操作是有副作用的,不会在客户端做缓存,
2)Get请求发送数据的时候,一般会将请求数据放在url字符串中发送给服务器端,所以从安全性角度来看相对没有Post请求安全性搞,所以get请求一般不会用于比较隐私数据的传输。而Post请求时将请求数据放在请求体body里面,所以一般用于表单数据,登录数据等数据的传输。
Jmeter
Apifox
postman
右键-》检查-》找到网络
Fiddler是通过改写HTTP代理,让数据从它那通过,来监控并且截取到数据。在打开它的那一瞬间,它就已经设置好了浏览器的代理了。当你关闭的时候,它又帮你把代理还原了。
官网下载:https://www.telerik.com/fiddler
按照指示填写,下载,然后傻瓜式安装,一直点击是就可以安装成功。
名称 | 含义 |
---|---|
# | 抓取HTTP Request的顺序,图标表示请求状态和响应状态 |
Result | HTTP状态码 (重点关注) |
Protocol | 请求使用的协议,常用HTTP,HTTPS |
Host | 请求地址的主机名 |
URL | 请求资源的位置 |
Body | 请求的大小 |
Caching | 请求的缓存过期时间或者缓存控制值 |
Content-Type | 请求响应的类型 |
Process | 发送此请求的进程:进程ID |
Comments | 允许用户为此回话添加备注 |
Custom | 允许用户设置自定义值 |
要访问HTTPS协议需要设置一下:Tools –> Fiddler Options ,选择HTTPS,勾选Decrypt HTTPS TrafficDecrypt,然后后面弹出的窗口都点击yes/是,点击Actions,最后点击OK
名称 | 含义 |
---|---|
Statistics | 请求的性能数据分析 |
Inspectors | 查看数据内容(常用) |
AutoResponder | 允许拦截指定规则的请求 |
Composer | 自定义请求发送服务器 |
Filters | 请求过滤规则(常用) |
Timeline | 请求响应时间 |
过滤最常用,过滤掉不需要的抓包数据,只显示自己需要的,这样看起来会方便很多。
1)过滤方式一:
2)过滤方式二:
?+字符串
@+host
=+状态码
安装Requests库:pip install requests
import requestsdef test1():resp = requests.get('http://www.taobao.com')print(resp.status_code) # 响应的状态码信息print(resp.text) # 获取响应对象的文本信息print(resp.url) # 获取响应对象所对应的请求地址if __name__ == '__main__':test1()
import requests# 直接在url上添加请求参数
def test1():resp = requests.get('https://baidu.com/s?wd=python') # 自动在url后面添加参数print(resp.text)# get请求+参数
def test2():data = {'wd': 'python',} # 请求参数resp = requests.get('https://baidu.com/s', params=data) # 自动在url后面添加参数print(resp.text)if __name__ == '__main__':test2()
import requestsdef test1():resp = requests.post('https://ynuf.aliapp.org/service/um.json?_bx-v=2.0.31')print(resp.status_code) # 响应的状态码信息print(resp.text) # 获取响应对象的文本信息print(resp.url) # 获取响应对象所对应的请求地址if __name__ == '__main__':test1()
import requests# 以json格式传
def test1():data = {"username": "test", "password": "123", "age": 18, "phone": 1588888888} # 字典格式是jsonresp = requests.post('', json=data)print(resp.text)if __name__ == '__main__':test1()
如果浏览器访问,响应正常,如果不是浏览器来访问,爬虫会代码访问,则响应不正常。这个需要用到headers信息。
import requests# 含有header访问才能跟浏览器访问显示一样的
def test1():headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'}resp = requests.get('', headers=headers)print(resp.text)if __name__ == '__main__':test1()
import requests# 绕过登录,想要获取登录之后的信息,需要带上Cookie
def test1():headers = {'Cookie': '' # 每次都要更新}resp = requests.get('', headers=headers)print(resp.text)if __name__ == '__main__':test1()
需要登录才能访问的接口,对于这种一定要使用session会话来帮助保存会话信息
import requests# 利用session保持会话状态
def test1():sess = requests.Session() # 创建一个session会话对象,帮助我们保存客户端的会话信息data = {'username': 'admin','password': 'admin123'}sess.post('', data=data) # 操作登录resp2 = sess.get('') # 请求登录之后的接口print(resp2.text)if __name__ == '__main__':test1()
import requests# 上传文件不带参数
def test1():files = {'file': open('test.txt', 'rb')}resp = requests.post('', files=files)print(resp.text)# 上传文件带其他参数
def test2():data = {'batchname': 'GB20210707' # 抓包的}files = {'batchfile': open('Test.xls', 'rb')}resp = requests.post('', data=data, files=files)print(resp.text)if __name__ == '__main__':test1()
询问开发用的什么加密方法
import requests# 加密接口请求
def test1():uid, name, password, salt = '3', 'qcj', '123456', 'LZ7dYxCj5S68ucAh'import hashlib # 有MD5加密方法hl = hashlib.md5()hl.update(('{}-{}-{}-{}'.format(uid, name, password, salt)).encode('utf-8'))sign = hl.hexdigest() # 对hl对象中保存的字段进行md5加密算法print(sign)data = {'uid': '3','sign': sign}resp = requests.post('', json=data)print(resp.text)if __name__ == '__main__':test1()
import requests# 接口参数关联(下一个请求的入参是上一请求的出参)
def test1():data = {'username': 'qcj','password': '123456'}resp = requests.post('', data=data) # 请求第一个接口resp_json = resp.json() # 第一个接口响应的json内容auth_token = resp_json['data'] # 提取第一个接口的data出参headers = {'auth-token': auth_token}resp = requests.get('', headers=headers) # 请求第二个接口print(resp.text)if __name__ == '__main__':test1()