文章目录
- 一、熟悉若requests库以及底层方法的调用逻辑
- 二、接口自动化以及正则和Jsonpath提取器的应用
- 6. 高频面试题:
- 9. 示例:接口关联
- 13. 文件上传示例
- 14. cookie关联的接口
努力经营当下 直至未来明朗
一、熟悉若requests库以及底层方法的调用逻辑
-
接口自动化主要包括:基于工具的接口自动化以及基于代码的接口自动化。
-
在pycharm上安装requests库:在控制台中输入
pip install requests
-
pycharm常用的requests库相关函数,按住ctrl+点击可以进入函数进行详细查看
requests.get(url, params=None, **kwargs) # 发送get请求,**kwargs是可变长度的字典
requests.post(url, data=None, json=None, **kwargs) # 发送post请求
# post中data和json的区别:取决于需要传递的参数的类型
# files:文件上传
requests.put(url, data=None, **kwargs) # 发送put请求
requests.delete(url, **kwargs) # 发送delete请求
requests.request(method, url, **kwargs)
# request可以替换以上四种,以上四种函数的底层调用的都是request方法
# **kwargs参数其实就是以上四种函数中的如params、data、json等参数
# request方法其实调用的是下面的方法:
# session.request(method=method, url=url, **kwargs)
# 区别在于:session的方法能够自动的关联有cookie关联的接口
# method=method 这是请求方式
# url=url 请求路径
# **kwargs 其实就可以是以下内容:
# params=None, get请求传参
# data=None, post或put请求传参
# headers=None, 请求头
# cookies=None, cookie
# files=None, 文件上传
-------
# auth=None, 鉴权
# timeout=None, 超时处理
# allow_redirects=True, 是否允许重定向
# proxies=None, 设置代理
# hooks=None, 钩子
# stream=None, 文件下载
# verify=None, 证书验证
# cert=None, CA证书
# json=None, post请求传参
requests.session() # 生成session对象,可以自动关联带有cookie的接口
- 接口自动化测试框架的封装是面试必问的!!
- 发送请求就会有响应,接收请求是由response对象来进行接收的,也是在requests库中。
- response对象经常使用的属性方法:
res = requests.get(url, params=None, **kwargs)
print(res.text) # 返回的文本信息
print(res.json()) # 返回的json格式
print(res.content) # 返回的字节内容
print(res.status_code) # 返回的状态码
print(res.reason) # 返回的状态信息
print(res.cookies) # 返回的cookie
print(res.encoding) # 返回的编码格式
print(res.headers) # 返回的响应头
print(res.request.请求数据) # 返回的请求数据(请求数据可以根据提示来进行选择)
二、接口自动化以及正则和Jsonpath提取器的应用
-
查看接口文档,需要了解以下内容
① 请求:请求方式、请求路径、请求参数、请求头
② 响应:响应码、响应信息、响应内容、响应头 -
在查看接口文档时,如果有接口约定的要先查看接口约定,有说明的先看说明。
-
说明是JSON:由 {键值对} 和 [数组] 组成的一组数据。
-
示例:
import requests
class TestApi:
# 1. 测试csdn用户主页获取
def test_get_token(self):
url = "https://blog.csdn.net/weixin_54150521" # 只是传递网址,问号之后的内容不同传递
data = {
"spm": "'Dream是普通小孩耶"
# 如果多个参数,使用,进行分隔;一定要给key和value都加上"",中间用:
# 注意和参数值的一个对应
}
res = requests.get(url, params=data) # 没有使用**kwargs则直接删除就行
print(res.text) # 返回的文本信息
# print(res.json()) # 返回的json格式,请求返回的数据不是完整的json数据格式
print(res.content) # 返回的字节内容
print(res.reason) # 返回的状态信息
if __name__ == '__main__': # 使用main来运行,但是注意一定是顶格的!! 空俩行
TestApi().test_get_token() # 初始化对象并调用其方法
- 下一个接口的参数需要使用上一个接口的返回值,这就是接口关联。
6. 高频面试题:
接口自动化实现接口关联的三种方式以及提取变量的两种方式:
1)实现接口关联的三种方式:
① 通过类变量(全局变量)保存中间变量实现接口关联
② 通过单独的文件保存中间变量实现接口关联
③ 极限封装成和工具一样只需要通过表达式就可以实现接口关联
2)提取变量的两种方式:
① 正则表达式提取:适用于提取文本结果
② JsonPath提取:适用于提取Json结果,返回的是列表[ ]
jsonpath.jsonpath(obj,expr)
# obj提取的对象 expr是jsonpath的表达式
- 补充:python中自动导包:alt + enter
- jsonpath表达式的规则:
① $ 根结点,即{起始位置
② . 子结点 如: .access_token,即子结点其实就相当于其中的key
③ … 递归取子结点 说明可以将所有的key都获取到
④ [] 代表取列表中的值,下标从0开始
9. 示例:接口关联
import jsonpath
import requests
class TestApi:
# 创建类变量,注意创建的方式,同样是需要使用""
access_token = ""
# 1. 获取鉴权码access token接口
def test_get_token(self):
url = "https://api.weixin.qq.com/cgi-bin/token"
datas = {
# 注意一定是{}的形式
"grant_type": "client_credential",
"appid": "wx74a8627810cfa308",
"secret": "e40a02f9d79a8097df497e6aaf93ab80"
}
res = requests.get(url, params=datas)
result = res.json()
# 提取access_token
value = jsonpath.jsonpath(result, "$.access_token")
# 返回的是一个列表[],可以使用下标指定
TestApi.access_token = value[0] # 获取第一个数据并保存到全局变量中
# 2. 获取公众号已创建的标签接口
# 注意格式位置一定要正确,否则是不能被正确识别到的
def test_select_flag(self):
url = "https://api.weixin.qq.com/cgi-bin/tags/get"
# 这里的参数其实就是之前返回的参数
datas = {
# 注意一定是{}的形式
"access_token": TestApi.access_token
}
res = requests.get(url, params=datas)
print(res.json())
if __name__ == '__main__':
TestApi().test_get_token()
TestApi().test_select_flag()
-
requests.post(url, data=None, json=None, **kwargs) # 发送post请求
1) post中data和json的区别:取决于需要传递的参数的类型
2)使用postman中body的参数类型进行对标:
① form-data:表单和文件
② x-www-form-urlencoded:纯表单
③ raw:有很多这种,最主要的是json
④ binary:把文件转换为二进制传输
3)so:参数为json的使用json传参,参数为文件的使用files来传参,其他的都是用data来进行传参。 -
post请求方式传递json参数 示例:
# 3. 创建标签接口(post请求方式)
def test_create_flag(self):
url = "https://api.weixin.qq.com/cgi-bin/tags/create?access_token=" + TestApi.access_token
datas = {
"tag": {"name": "广东" + str(random.randint(10000, 99999))}
# 可以进行随机数转字符串的拼接:str(random.randint(10000,99999))
}
res = requests.post(url, json=datas)
print(json.loads(json.dumps(res.json()).replace("\\\\","\\")))
# unicode编码转为正常编码
13. 文件上传示例
1)代码示例
# 4. 文件上传
def test_file_upload(self):
url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=" + TestApi.access_token
datas = {
"media": open("C:/Users/lenovo/Desktop/栈帧.png", "rb")
# 后面是文件的路径,注意接口文档的要求是文件or字节流
# 文件模式为字节处理 rb
}
res = requests.post(url, files=datas)
print(res.json())
2) 可能会报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xf0 in position 19: illegal multibyte sequence
这是因为文件在转成字节流的时候文件模式没有按照字节流处理,此时就需要修改为open(“文件路径”,“rb”)。可以参考:python报错:文件模式处理
14. cookie关联的接口
- 正则表达式适用于提取文本结果
re.search()
提取一个值,通过下标取值
2)re.findall()
提取多个值,通过下标取值
- 一般由cookie关联的我们不会单独去使用get、post方法发送请求;而是直接先全局初始化一个session对象,然后使用request方法发送请求。
# cookie关联的接口
# 1. 访问首页
def test_start(self):
url = "http://47.107.116.139/phpwind/"
# 使用session对象发送请求
res = TestApi.sess.request(method='get', url=url)
# res = requests.get(url)
result = res.text
# print(res.text) # 文本打印
TestApi.csrf_token = re.search('name="csrf_token" value="(.*?)"', result).group(1)
# 2. 测试登录
def test_login(self):
url = "http://47.107.116.139/phpwind/index.php?m=u&c=login&a=dorun"
datas = {
"username": "baili",
"password": "baili123",
"csrf_token": TestApi.csrf_token,
"back_url": "http://47.107.116.139/phpwind/",
"invite": ""
}
headers = {
"Accept": "application/json, text/javascript, /; q=0.01",
"x-Requested-With": "XMLHttpRequest"
}
# 使用session对象发送请求
res = TestApi.sess.request(method='post', url=url, data=datas, headers=headers)
# res = requests.post(url, data=datas, headers=headers)
print(res.json())
- 在发送请求的时候,我们不知道其是不是有cookie的关联,所以最好直接使用request来发送请求。(需要先初始化全局变量session对象)