接口测试
应用程序编程接口(API:Application Programming Interface):以HTTP协议形式提供,定义了输入、输出、功能描述的服务
即是规矩的制定
流程:
1、接口的功能测试(先要保证接口是正确的)
2、测试接口的数据(传递一些特殊的数据,保证接口没有问题)----比如淘宝上不能搜索到一些国家禁止售卖的东西
3、自动化测试脚本的编辑
4、接口的性能、压力测试
HTTP协议:
协议:计算机通信网络中两台电脑 之间进行通信所必须共同遵守的规则或规定
HTTP协议:超文本传输协议,是一种规定了浏览器和服务器之间通信的规则
URL(统一资源定位符)
概念:互联网上源源的地址、位置、每一个资源都有一个唯一的URL
格式:协议://主机地址/路径
GET请求
提交的数据显示在地址栏,不安全;提交的数据量有限制,不重要的的数据使用 GET
比如在淘宝搜索商品时,地址栏会出现商品名字
POST请求
隐式提交数据,更安全;没有数据量大小的限制;重要数据使用POST
数据传递的方式:
键值对: ?xx=11&xx=22 问号前面是网址,后面是传的值 &前面是属性名,后面是属性值
Json数据:
{
"属性名1":"属性值1",
"属性名2":"属性值2",
"属性名3":"属性值3"
}
HTTP协议之常见响应状态码
1xx:指示信息---表示请求已接收,继续处理
2xx:成功 ---表示请求已被成功接收,理解、接受
3xx:重定向---要完成请求必须进行更一步操作
4xx: 客户端错误---请求有语法错误或请求无法实现
5xx:服务器端错误---服务器未能实现合法的请求
restful风格:
按照一定的规则写出的易读、易懂的api文档;目的是让前端、后端、测试三方在工作的时候有据可循,提升开发的测试的效率(非常制要求)
增删改查四大功能的语法风格:
1、查
方法:get
响应码:200+查询的数据
2、增
方法:post
响应码:201+新增的数据
3、改
方法:put
响应码:200或201 +修改后的数据
4、删
方法:delete
响应码:204 (后面不加东西)
接口测试“聚合数据”地址
https://www.juhe.cn/ucenter/account
13480.....47 maggic108222
接口自动化测试
2种方式:jmeter和使用python写代码的方式(使用request库)
一、request库
1、安装和查看效果:
pip install requests
pip show requests
2、发送请求
常见的HTTP请求方式:GET、POST、PUT、DELETE、HEAD、OPTIONS
使用requests发送网络请求只需要调用HTTP请求所对应的方法即可
2.1 GET请求
import requests;
response=requests.get()
请求方法的返回值response为Response对象,我们可以从这个对象中获取 所有我们想要的响应信息
实例:
"""
请求方法:GET
响应:
响应对象.url #获取请求url
响应对象.status_code #获取响应状态码
响应对象.text #以文本形式显示响应内容
"""
import requests;
url='http://baidu.com'
#调用GET
response=requests.get(url);
#获取请求url
print('请求url是:',response.url);
#获取响应状态码
print("状态码:",response.status_code);
#获取响应信息 文本形式
print("文本响应内容",response.text);
结果:
请求url是:http://baidu.com/
状态码:200
文本响应内容 <html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
GET方法带参使用:
参数:params
方式1:params={"id":1001}
方式2:params={"id":"1001,1002"}
方式3:params={"id":1001,"kw":"北京"}
"""
请求方法:GET
案例:
1、http://www.baidu.com?id=1001
2、http://www.baidu.com?id=1001,1002
3、http://www.baidu.com?id=1001&kw=北京
参数:
params:字典或字符串
响应:
响应对象.url #获取请求url
响应对象.status_code #获取响应状态码
响应对象.text #以文本形式显示响应内容
"""
import requests;
url='http://baidu.com'
#案例1 定义字典
# params={"id":1001}
#案例2 定义列表
# params={"id":"1001,1002"}
#运行的结果是:http://baidu.com/?id=1001%2C1002 %2c是逗号
#案例3 定义列表
params={"id":1001,"kw":"北京"}
#结果:请求url是:http://baidu.com/?id=1001&kw=%E5%8C%97%E4%BA%AC
#调用GET
#请求时带参 params
response=requests.get(url,params=params);
#获取请求url
print('请求url是:',response.url);
#获取响应状态码
print("状态码:",response.status_code);
#获取响应信息 文本形式
print("文本响应内容",response.text);
2.2 POST请求
作用:新增资源
应用:
1)导包
2)调用POST方法 requests.post()
参数:
1)url
2) json 新增请求报文
3) Headers: 请求信息头
案例:
"""
案例:新增学院
参数:
1、json:传入json字符串
2、headers:传入请求信息头内容
响应:
1、响应对象.json()
接口文档里的内容:
2.1 学院--新增
1)请求方法:POST
2)请求地址:http://v.juhe.cn/weather/index #其实地址不是正确的,因为我本来就没有这个项目,这个是随手拿的天气预报的接口地址
3)请求信息头:Content-Type:application/json
4)调用传入的json串如下(可新增多条,之间用,号隔开)
{
"data":[
{
"dep_id":"T01",
"dep_name":"Test学院",
"master_name":"Test-Master",
"slogan":"Here is Slogan"
}
]
}
"""
#1、导包
import requests;
#调用post
#请求url
url='http://v.juhe.cn/weather/index'
#请求headers
headers={"Content-Type": "application/json"}
#请求json
data = {
"data": [
{
"dep_id": "T01",
"dep_name": "Test学院",
"master_name": "Test-Master",
"slogan": "Here is Slogan"
}
]
}
response=requests.post(url,json=data,headers=headers)
#获取响应对象
print(response.json())
#获取响应状态码
print(response.status_code);
运行结果:
如果是真实存在一个学院管理系统,那结果应该是长这样子的:
{"already_exist":{'count':0, 'results':[]}, 'create_success':{'count':1, 'results':[{"dep_id": "T01", "dep_name": "Test学院", "master_name": "Test-Master", "slogan": "Here is Slogan"}]}}
201
但是因为我其实拿的是天气预报的接口地址,然后参数又是拿安全的参数,所以最终的结果是“错误的请求KEY",如下所示
{'error_code': 10001, 'resultcode': '101', 'reason': '错误的请求KEY', 'result': None}
200
扩展1:
data与json的区别
data:字典对象
json:json字符串
提示:
在python中字典对象和json字符串长得一样,但是后台格式不同,因此直接使用data会报错
转换:
导入json
使用json.dumps(字典对象) 方法来转换
实例:
"""
案例:新增学院
参数:
1、json:传入json字符串
2、headers:传入请求信息头内容
响应:
1、响应对象.json()
接口文档里的内容:
2.1 学院--新增
1)请求方法:POST
2)请求地址:http://127.0.0.1:8000/api/departments
3)请求信息头:Content-Type:application/json
4)调用传入的json串如下(可新增多条,之间用,号隔开)
{
"data":[
{
"dep_id":"T01",
"dep_name":"Test学院",
"master_name":"Test-Master",
"slogan":"Here is Slogan"
}
]
}
"""
#1、导包
import json
import requests;
#调用post
#请求url
url='http://v.juhe.cn/weather/index'
#请求headers
headers={"Content-Type": "application/json"}
#请求json
data = {
"data": [
{
"dep_id": "T01",
"dep_name": "Test学院",
"master_name": "Test-Master",
"slogan": "Here is Slogan"
}
]
}
# response=requests.post(url,json=data,headers=headers);
#如果使用data,则会报Json parse error。直接这样子写是不行的,需要将字典对象转换成json字符串
#response=requests.post(url,data=data,headers=headers);
#将字黄对象转换为json字符串
response=requests.post(url,data=json.dumps(data),headers=headers);
#获取响应对象
print(response.json())
#获取响应状态码
print(response.status_code);
扩展2:响应数据.text与响应数据.json的区别
长相基本一致,但r.json的类型是字典,可以通过键名获取值;r.text只是一个字符串
如果想要取值就要使用.json的方式
2.3 PUT方法 更新资源
应用:
1)导包 import requests
2) 调用put方法 requests.put()
实例
#1、导包
import json
import requests;
#调用post
#请求url
#url='http://v.juhe.cn/weather/index'
#案例的地址原来是这样子的
# url="http://127.0.0.1:8000/api/departments"
#然后因为是要PUT(更新一条学院信息),需要在url后加加上具体的dep_id
url="http://127.0.0.1:8000/api/departments/T01"
#请求headers
headers={"Content-Type": "application/json"}
#请求json
data = {
"data": [
{
"dep_id": "T01",
"dep_name": "Test学院2", #假设需要改学院的名称,则在此作出改动
"master_name": "Test-Master",
"slogan": "Here is Slogan"
}
]
}
response=requests.put(url,data=json.dumps(data),headers=headers);
#获取响应对象
print(response.json())
#获取响应状态码
print(response.status_code);