画布 1
接口测试内容梳理
  接口测试
    常见的接口协议
      HTTP 协议
        请求
          请求行
            请求方法 method
              GET
              POST
              PUT
              DELETE
            url
            协议版本 protocol
          请求头
            客户端自报家门
          请求参数
            query 拼接在 url 中
            协议://主机名/IP:端口/路径?请求参数（key=value）
          请求体
            request body
              json
              form 表单格式
              文件格式
        响应
          响应状态行
            协议
            响应状态码 status code
          响应头
            服务端自报家门
          响应体
            客户端发出请求所需要得到的数据
      RESTFul 架构
        GET 获取资源
        POST 新增或者更新资源
        PUT 更新资源
        DELETE 删除资源
    postman 测试接口
      发请求
        GET
          请求参数拼接在 url 中
            params 中设置
        POST
          body 中设置，支持不同格式的请求体
            form 表单
            json 格式
            文件
      查看响应
        响应体
          展示格式化好的响应体
        响应头信息
        响应状态、时间
      操作请求头信息
        请求 headers
          添加
          修改
          删除
        postman 会自动化添加一部分请求头
      编写断言
        tests
          使用 postman 提供的代码片段
            状态断言
              验证响应状态码
            业务断言
              验证响应体中是否包含某个字符串
              验证 json 格式响应体中某个 key 的 value 是否符合预期
              验证响应体是否与某个字符串完全相同
            头信息断言
              验证响应头信息中是否存在某个 key
            响应时间断言
              验证响应时间是否小于某个值
      测试前脚本
        设置变量
        准备测试数据
        准备测试状态
      鉴权
        常见鉴权方式都支持
      变量设置与引用
        种类
          环境变量
          测试集变量
          全局变量
          普通变量
        引用
          {{变量名}}
      测试集
        创建
          分类管理
          构造接口业务场景
        设置
          鉴权
          测试集变量
          断言
        运行
          批量运行接口用例
          数据驱动
            csv
            json
        导出
        导入
      导出自动化接口测试代码
        python requests
    抓包与 mock 测试
      Charles
        安装
          官网
          学院网盘
        基础配置
          确认抓包端口
            默认 8888
          勾选 支持 http 2 版本
          勾选 支持远程代理
            抓去移动设备数据
          电脑本地网络数据抓取开关
            Proxy -- MacOS/Windows Proxy
        证书安装和配置
          电脑本地证书安装
            Help -- SSL Proxying -- Install Charles Root Certificate
              Windows
                进入证书安装界面
                  受信任的根证书
              Mac
                进入钥匙串
                  设置 2 次始终信任
          设置 SSL
            入口：Proxy -- SSL Proxying Settings
            Include 中添加规则
              host 和 port 都可以留空，点击 ok
          移动端配置代理
            保证移动设备和电脑处于同一 wifi 下
            查看电脑 IP 地址，确认好 charles 的抓包端口
            移动设置配置网络代理
              设置 -- 网络-- 高级选项 -- 代理设置为手动代理
              代理：电脑 IP 地址
              端口：charles 抓包端口
            安装证书
              使用浏览器（系统浏览器、qq浏览器），输入 chls.pro/ssl
              点击通知栏中的下载完成信息，进入证书安装界面
            弹出连接警告弹窗，点击 Allow
        基础使用
          抓包查看接口数据
            overview
              接口的总体信息
                请求方法
                请求 url
                请求和响应的时间
                流量
            content
              上半部分：请求相关信息
                headers
                query
                raw
                body
                cookie
              下半部分：响应相关信息
                headers
                body
                  可以查看不同的格式
                raw
          过滤
            Filter
            focus
          重发
            简单重发
            进阶重发
              重发数量
              并发数量
              重发间隔时间
              简单的压力测试
          修改请求
            请求方法
            请求 url
            请求参数
            请求头信息
          断点
            请求断点
              在请求发出之后，服务端收到之前进行拦截
              修改请求相关参数
            响应断点
              在服务端响应发出之后，客户端收到响应之前进行拦截
              修改响应相关参数
            问题：容易超时，合适服务端超时限制不高的场景，或者修改内容简单的场景
        弱网测试
          基础弱网
            点击小乌龟图标
          弱网配置
            Proxy -- Throttle Settings
            可以指定弱网生效的域名
            选择不同的预设网络配置
            自定义网络参数
              带宽
                上行速度
                下载速度
              带宽可用率
              网络延迟时间
              最大传输单位
              可靠性
              稳定性
              不稳定质量范围
        mock
          Rewrite
            使用场景
              全局的内容 mock
              修改内容比较简单
              请求和响应都可以修改
            设置
              Tools -- Rewrite
              创建重写规则
                配置要修改的接口
                创建内容修改规则
          MapLocal
            使用场景
              对响应体进行复杂修改
            设置
              准备本地数据文件
              选择要 mock 的接口
                鼠标右键 -- 点击 Map Local
                  配置要 mock 的接口的匹配信息
                  配置目标的本地数据文件
              修改或者关闭
                Tools -- Map Local
                  勾选/去掉 enable
                  双击对应的规则，进入修改设置的界面
          MapRemote
            使用场景
              修改要访问的服务器地址
              app 测试中，修改线上环境或者线下环境
            设置
              选择要 mock 的接口
                鼠标右键 -- 点击 Map Remote
                  配置要 mock 的接口的匹配信息
                  配置目标服务器的地址
              修改或者关闭
                Tools -- Map Remote
                  勾选/去掉 enable
                  双击对应的规则，进入修改设置的界面
  接口自动化测试
    L1
      接口请求构造
        r = requests.get(url)
        r = requests.post(url)
        r = requests.request(method, url)
        携带不同格式的请求参数
          拼接在 url 中的请求参数
            使用插值的方式，直接拼接在 url 中即可
              url = f"http://host/path?key=value&key2=value2"
            使用 params 传递
              r = requests.get(url, params=param)
              param 需要定义为字典格式
                {
"key": "value",
"key2": "value2"
}
          json 格式的请求数据
            使用 json 传递
              r = requests.get(url, json=param)
              param 需要定义为字典格式
                {
"key": "value",
"key2": "value2"
}
      接口测试断言
        状态断言
          assert r.status_code == 200
        业务断言
          assert r.json().get("key") == expect
          r.json()["key"]
    L2
      复杂请求构造
        POST 请求传递不同格式的请求体
          form 格式
            requests.post(url, data={})
          json 格式
            requests.post(url, json={})
          文件格式
            requests.post(url, files={})
      复杂断言处理
        jsonpath
          使用 jsonpath 第三方库
          jsonpath(r.json(), "jsonpath 表达式")
          jsonpath 表达式
            $ 根结点
            . 下一层级
            .. 任意层级
      配置代理
        requests.get(url, proxies={"http": "http://127.0.0.1:8888", "https": "http://127.0.0.1:8888"}, verify=False)
      cookie 处理
        请求头设置
          requests.get(url, headers={"Cookie": "key=value"})
      超时处理
        requests.get(url, timeout=0.01)
    L3
      接口测试框架封装
        目的
          框架更加稳定
        思路
          分层
          公共的方法进行封装
          接口实现和测试用例以及断言进行拆分
        ApiObject
          BaseApi
            底层框架
          ServiceApi
            业务接口描述
          Testcase
            接口测试用例以及断言
      接口鉴权
        cookie
          request.Session()
        token
          携带身份信息请求认证接口
            返回 token
          携带 token 请求其他业务接口
        auth
          每次请求携带用户信息
            request.get(url, auth=HTTPBasicAuth("usename", "password"))
      jsonschema
        校验 json 格式是否符合预期
        使用 jsonschema 第三方库
        validate(instance=obj, schema=schema)
      数据库操作与断言
        使用 pymysql 第三方库
          连接数据库
            connect = pymysql.connect(host, port, user, password. database, charset)
          创建游标
            cursor = connect.cursor()
          执行 SQL 语句
            cursor.execute(SQL)
          获取执行结果
            cursor.fetchone()
    L4
      接口加密解密
        知道使用的是什么加密算法
          自行使用对应的工具解密
        开发知道，让开发提供对应的加密工具库
        第三方加密，让加密方提供远程解析服务
      多套被测环境
        使用文件管理多套测试环境
          yaml
          ini
          定义常量类
        切换环境
          通过环境变量
          通过命令行参数
      多协议封装设计
        把获取到的响应统一转化为 python 对象进行处理