【自动化测试】接口自动化01


努力经营当下 直至未来明朗

一、熟悉若requests库以及底层方法的调用逻辑

  1. 接口自动化主要包括:基于工具的接口自动化以及基于代码的接口自动化。

  2. 在pycharm上安装requests库:在控制台中输入pip install requests
    在这里插入图片描述

  3. 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的接口
  1. 接口自动化测试框架的封装是面试必问的!!
  2. 发送请求就会有响应,接收请求是由response对象来进行接收的,也是在requests库中。
  3. 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提取器的应用

  1. 查看接口文档,需要了解以下内容
    ① 请求:请求方式、请求路径、请求参数、请求头
    ② 响应:响应码、响应信息、响应内容、响应头

  2. 在查看接口文档时,如果有接口约定的要先查看接口约定,有说明的先看说明。

  3. 说明是JSON:由 {键值对} 和 [数组] 组成的一组数据。

  4. 示例:

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()    # 初始化对象并调用其方法
  1. 下一个接口的参数需要使用上一个接口的返回值,这就是接口关联

6. 高频面试题:

接口自动化实现接口关联的三种方式以及提取变量的两种方式:

1)实现接口关联的三种方式:

① 通过类变量(全局变量)保存中间变量实现接口关联
② 通过
单独的文件
保存中间变量实现接口关联
极限封装成和工具一样只需要通过表达式就可以实现接口关联

2)提取变量的两种方式:

① 正则表达式提取:适用于提取文本结果
② JsonPath提取:适用于提取Json结果,返回的是列表[ ]
jsonpath.jsonpath(obj,expr) # obj提取的对象 expr是jsonpath的表达式

  1. 补充:python中自动导包:alt + enter
  2. 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()
  1. requests.post(url, data=None, json=None, **kwargs) # 发送post请求
    1) post中data和json的区别:取决于需要传递的参数的类型
    2)使用postman中body的参数类型进行对标:
    11
    ① form-data:表单和文件
    ② x-www-form-urlencoded:纯表单
    ③ raw:有很多这种,最主要的是json
    ④ binary:把文件转换为二进制传输
    3)so:参数为json的使用json传参,参数为文件的使用files来传参,其他的都是用data来进行传参。

  2. 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报错:文件模式处理
13

14. cookie关联的接口

  1. 正则表达式适用于提取文本结果
  1. re.search() 提取一个值,通过下标取值
    2)re.findall() 提取多个值,通过下标取值
    15
  1. 一般由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())
  1. 在发送请求的时候,我们不知道其是不是有cookie的关联,所以最好直接使用request来发送请求。(需要先初始化全局变量session对象)

猜你喜欢

转载自blog.csdn.net/weixin_54150521/article/details/132242250