文章目录
- 一、熟悉若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 requestsclass 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_tokenvalue = 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_tokendatas = {"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_tokendatas = {"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对象)