• 接口自动化测试_L4


    目录:

    1. 接口加密与解密
      1. ​​​​​​​环境准备
      2. 原理
      3. 实战练习
    2. 多套被测环境
      1. ​​​​​​​多环境介绍
      2. 多套被测环境切换的意义和价值
      3. 实现目标
      4. 实现方案-环境管理
      5. 环境切换
      6. 通过环境变量进行切换
      7. 使用命令行进行切换
    3. 多响应类型封装设计
      1. ​​​​​​​​​​​​​​多协议封装应用场景
      2. 实战演示
      3. xml 转换 dict(Python)
      4. 多协议封装(Python)
    4. 电子商城接口自动化测试框架实战

    1.接口加密与解密

    环境准备
    1. 对响应加密的接口。对它发起一个get请求后,得到一个加密过后的响应信息。(如果有可用的加密过的接口以及了解它的解密方法,可以跳过)
    2. 准备一个加密文件.
    3. 使用python命令在有加密文件的所在目录启动一个服务
    4. 访问该网站
    1. 创建一个demo.json文件
    2. 使用base64 demo.json >demo.txt命令
    3.  demo.txt我放在最后了,有项目地址

    启动服务器: 

    • python -m http.server 9999 

    运行结果: 

    原理

    在得到响应后对响应做解密处理:

    • 如果知道使用的是哪个通用加密算法的话,可以自行解决。
    • 如果不了解对应的加密算法的话,可以让研发提供加解密的lib。
    • 如果既不是通用加密算法、研发也无法提供加解密的lib的话,可以让加密方提供远程解析服务,这样算法仍然是保密的。

    运行以下代码之前先把上边那个服务器开启!9999 

    test_encode.py

    1. import json
    2. import requests
    3. import base64
    4. class TestApiRequest:
    5. def test_decode(self):
    6. url = "http://localhost:9999/demo.txt"
    7. r = requests.get(url=url)
    8. res = json.loads(base64.b64decode(r.content))
    9. print()
    10. print(res)
    11. print(r.text)
    12. req_data = {
    13. "method": "get",
    14. "url": "http://localhost:9999/demo.txt",
    15. "headers": None,
    16. "encoding": "base64"
    17. }
    18. def send(self, data: dict):
    19. res = requests.request(method=data["method"], url=data["url"], headers=data["headers"])
    20. if data["encoding"] == "base64":
    21. return json.loads(base64.b64decode(res.content))
    22. # 把加密过后的响应值发给第三方服务,.让第三方太做解密然后返回解密过后的信息
    23. elif data["encoding"] == "private":
    24. return requests.post("url", data=res.content)
    25. def test_send(self):
    26. print()
    27. print(self.send(self.req_data))

     运行结果:

    实战练习
    1. 调用python自带的base64,直接对返回的响应做解密,即可得到解密后的响应。
    2. 封装对于不同算法的处理方法。 

    2.多套被测环境

    多环境介绍
    环境使用场景备注
    dev开发环境开发自测
    QA测试环境QA日常测试
    preprod预发布环境回归测试、产品验测试
    prod线上环境用户使用的环境
    多套被测环境切换的意义和价值 
    • 访问信息: 不同环境的域名或ip都不一样,部分产品Host也会有区别
    • 配置信息: DB、Redis、ES等中间件的配置信息不同环境也不一样
    1. # 每条用例的url都是写死的,一旦切换环境,所有的用例都要修改。
    2. r = requests.post("https://httpbin.ceshiren.com/post",data=data)
     实现目标
    1. 全局控制,一键切换
    2. 可维护性和扩展性强,可以应对不断演进的环境变化。
    实现方案-环境管理 
    • 使用环境管理文件
      • yaml
      • ini
      • 常量类
    • 使用不同的文件管理不同的环境
    • 在接口用例中只指定path,不指定url
    1. # test.yaml 测试环境的配置
    2. env_config:
    3. base_url: https://httpbin.org/
    4. db_config:
    5. host: httpbin.org
    6. username: xxxx
    7. password: xxxx
    8. redis_config:
    9. host: httpbin.org
    10. port: 8100
    1. # dev.yaml 开发环境的配置
    2. env_config:
    3. base_url: https://httpbin.bai.com/
    4. db_config:
    5. host: httpbin.bai.com
    6. username: xxxx
    7. password: xxxx
    8. redis_config:
    9. host: httpbin.bai.com
    10. port: 8100
    环境切换
    • 通过环境变量进行切换
    • 通过命令行参数进行切换
     通过环境变量进行切换
    • 设置环境变量
    • 读取环境变量
    1. # mac设置环境变量
    2. export env=dev
    3. # windows 设置环境变量
    4. set env=dev
    1. # 在python中读取环境变量
    2. import os
    3. import requests
    4. import yaml
    5. class TestMulitiEnv:
    6. def setup_class(self):
    7. default = os.getenv("env", default="test")
    8. data = yaml.safe_load(open(f"./datas/environment/{default}.yaml", encoding="utf-8"))
    9. self.env = data
    10. self.base_url = self.env["base_url"]
    11. # 开发环境
    12. def test_devenv(self):
    13. path = "/get"
    14. r = requests.get(self.base_url + path, verify=False)
    15. assert r.json()["headers"]["Host"] == "httpbin.org"
    16. # 测试环境
    17. def test_testenv(self):
    18. path = "/post"
    19. r = requests.post(self.base_url + path, verify=False)
    20. assert r.json()["headers"]["Host"] == "httpbin.ceshiren.com"

    dev.yaml

    1. #开发环境的配置文件
    2. base_url: https://httpbin.ceshiren.com/

     test.yaml

    1. #测试环境的配置文件
    2. base_url: https://httpbin.org/

    项目结构:

     运行结果:(一个通过,一个失败,原因:只能开启一个环境变量)

    1. set env=test
    2. pytest .\test_env.py

    使用命令行进行切换 

    与《selenium 多浏览器处理》章节逻辑相同 

    1. # conftest.py
    2. global_env = {}
    3. def pytest_addoption(parser):
    4. # group 将下面所有的 option都展示在这个group下。
    5. mygroup = parser.getgroup("hdc")
    6. # 注册一个命令行选项
    7. mygroup.addoption("--env",
    8. # 参数的默认值
    9. default='test',
    10. # 存储的变量
    11. dest='env',
    12. # 参数的描述信息
    13. help='设置接口自动化测试默认的环境'
    14. )
    15. def pytest_configure(config):
    16. default_ev = config.getoption("--env")
    17. tmp = {"env": default_ev}
    18. global_env.update(tmp)

    1. # test_muliti_env.py
    2. import requests
    3. import yaml
    4. from interface_automation_testing.接口自动化测试_L4.多套被测环境.conftest import global_env
    5. class TestMulitiEnv:
    6. def setup_class(self):
    7. # 获取命令行配置的环境变量
    8. default = global_env.get("env")
    9. data = yaml.safe_load(open(f"./datas/environment/{default}.yaml", encoding="utf-8"))
    10. self.env = data
    11. self.base_url = self.env["base_url"]
    12. def test_devenv(self):
    13. path = "/get"
    14. r = requests.get(self.base_url + path, verify=False)
    15. assert r.json()["headers"]["Host"] == "httpbin.ceshiren.com"
    16. def test_testenv(self):
    17. path = "/post"
    18. r = requests.post(self.base_url + path, verify=False)
    19. assert r.json()["headers"]["Host"] == "httpbin.org"

    在终端中运行以下代码: 

    1. pytest .\test_muliti_env.py --env=dev
    2. pytest .\test_muliti_env.py --env=test

     运行结果:

    项目结构:

    3.多响应类型封装设计

    多协议封装应用场景
    • 问题:
      • 响应值不统一
        • json
        • xml
      • 断言比较困难
    • 解决方案:获得的响应信息全部转换为结构化的数据进行处理 

    解决方案:

    没有改进的:

    改进之后的:

    实战演示

    实战目标: 对响应值做二次封装,可以使用统一提取方式完成断言

    xml 转换 dict(Python) 
    • 环境准备: pip install xmltodict
    • 依赖包版本: 0.13
    1. import xmltodict
    2. import requests
    3. def test_xml_dict():
    4. """
    5. xml转换为json
    6. :return:
    7. """
    8. res = requests.get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss")
    9. dict_res = xmltodict.parse(res.text)
    10. print(dict_res)
    11. print(type(dict_res))
    多协议封装(Python) 
    1. import requests
    2. import xmltodict
    3. from requests import Response
    4. def response_dict(response: Response):
    5. res_text = response.text
    6. if res_text.startswith("):
    7. final_dict = xmltodict.parse(res_text)
    8. elif res_text.startswith(""):
    9. final_dict = "html"
    10. else:
    11. final_dict = response.json()
    12. return final_dict
    13. def test_response_dict():
    14. # xml
    15. # res = requests.get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss")
    16. # json
    17. res = requests.get("https://httpbin.ceshiren.com/get", verify=False)
    18. final_res = response_dict(res)
    19. print(type(final_res))
    20. print(final_res)
    21. assert isinstance(final_res, dict)

    4.电子商城接口自动化测试框架实战

    现有问题
    • 可维护性差:一个 api 发生变化,需要修改用例文件
    • 可读性差:无法从代码中看出来明确的业务逻辑
    • 断言能力差:响应内容只能一层一层提取
    架构优化设计 

    添加领域模型 
    • domain 更多代表业务模式的抽象,没有具体的实现

    待更新............................................................................

  • 相关阅读:
    Office文件在线预览大全-Word文档在线预览的实现方法-OFD文档在线预览-WPS文件在线预览
    Linux 进程线程
    [Python]Flask简介与gunicorn部署
    i5 1230u怎么样 i51230u相当于什么水平级别
    AIGC(生成式AI)试用 12 -- 年终再总结
    Excel·VBA分列、字符串拆分
    11. 一文快速学懂常用工具——网络工具(下)
    ios下input不能输入,没有光标的原因及解决办法
    Python并发编程:多线程与多进程实战
    “人生苦短,我用Python“——Web测试
  • 原文地址:https://blog.csdn.net/qq_56444564/article/details/133861474