接口自动化测试_L4

news2025/2/22 19:58:13

目录:

  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

import json
import requests
import base64


class TestApiRequest:
    def test_decode(self):
        url = "http://localhost:9999/demo.txt"
        r = requests.get(url=url)
        res = json.loads(base64.b64decode(r.content))
        print()
        print(res)
        print(r.text)

    req_data = {
        "method": "get",
        "url": "http://localhost:9999/demo.txt",
        "headers": None,
        "encoding": "base64"
    }

    def send(self, data: dict):
        res = requests.request(method=data["method"], url=data["url"], headers=data["headers"])
        if data["encoding"] == "base64":
            return json.loads(base64.b64decode(res.content))
        # 把加密过后的响应值发给第三方服务,.让第三方太做解密然后返回解密过后的信息
        elif data["encoding"] == "private":
            return requests.post("url", data=res.content)

    def test_send(self):
        print()
        print(self.send(self.req_data))

 运行结果:

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

2.多套被测环境

多环境介绍
环境使用场景备注
dev开发环境开发自测
QA测试环境QA日常测试
preprod预发布环境回归测试、产品验测试
prod线上环境用户使用的环境
多套被测环境切换的意义和价值 
  • 访问信息: 不同环境的域名或ip都不一样,部分产品Host也会有区别
  • 配置信息: DB、Redis、ES等中间件的配置信息不同环境也不一样
# 每条用例的url都是写死的,一旦切换环境,所有的用例都要修改。
r = requests.post("https://httpbin.ceshiren.com/post",data=data)
 实现目标
  1. 全局控制,一键切换
  2. 可维护性和扩展性强,可以应对不断演进的环境变化。
实现方案-环境管理 
  • 使用环境管理文件
    • yaml
    • ini
    • 常量类
  • 使用不同的文件管理不同的环境
  • 在接口用例中只指定path,不指定url
# test.yaml 测试环境的配置
env_config:
  base_url: https://httpbin.org/
db_config:
  host: httpbin.org
  username:  xxxx
  password:  xxxx
redis_config:
  host: httpbin.org
  port: 8100
# dev.yaml 开发环境的配置
env_config:
  base_url: https://httpbin.bai.com/
db_config:
  host: httpbin.bai.com
  username:  xxxx
  password:  xxxx
redis_config:
  host: httpbin.bai.com
  port: 8100
环境切换
  • 通过环境变量进行切换
  • 通过命令行参数进行切换
 通过环境变量进行切换
  • 设置环境变量
  • 读取环境变量
# mac设置环境变量
export env=dev
# windows 设置环境变量
set env=dev
# 在python中读取环境变量
import os
import requests
import yaml


class TestMulitiEnv:
    def setup_class(self):
        default = os.getenv("env", default="test")
        data = yaml.safe_load(open(f"./datas/environment/{default}.yaml", encoding="utf-8"))
        self.env = data
        self.base_url = self.env["base_url"]

    # 开发环境
    def test_devenv(self):
        path = "/get"
        r = requests.get(self.base_url + path, verify=False)
        assert r.json()["headers"]["Host"] == "httpbin.org"

    # 测试环境
    def test_testenv(self):
        path = "/post"
        r = requests.post(self.base_url + path, verify=False)
        assert r.json()["headers"]["Host"] == "httpbin.ceshiren.com"

dev.yaml

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

 test.yaml

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

项目结构:

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

set env=test
pytest .\test_env.py

使用命令行进行切换 

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

# conftest.py
global_env = {}

def pytest_addoption(parser):
    # group 将下面所有的 option都展示在这个group下。
    mygroup = parser.getgroup("hdc")
    # 注册一个命令行选项
    mygroup.addoption("--env",
     # 参数的默认值
    default='test',
    # 存储的变量
    dest='env',
    # 参数的描述信息
    help='设置接口自动化测试默认的环境'
     )

def pytest_configure(config):
    default_ev = config.getoption("--env")
    tmp = {"env": default_ev}
    global_env.update(tmp)

# test_muliti_env.py
import requests
import yaml

from interface_automation_testing.接口自动化测试_L4.多套被测环境.conftest import global_env


class TestMulitiEnv:
    def setup_class(self):
        # 获取命令行配置的环境变量
        default = global_env.get("env")
        data = yaml.safe_load(open(f"./datas/environment/{default}.yaml", encoding="utf-8"))
        self.env = data
        self.base_url = self.env["base_url"]

    def test_devenv(self):
        path = "/get"
        r = requests.get(self.base_url + path, verify=False)
        assert r.json()["headers"]["Host"] == "httpbin.ceshiren.com"

    def test_testenv(self):
        path = "/post"
        r = requests.post(self.base_url + path, verify=False)
        assert r.json()["headers"]["Host"] == "httpbin.org"

在终端中运行以下代码: 

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

 运行结果:

项目结构:

3.多响应类型封装设计

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

解决方案:

没有改进的:

改进之后的:

实战演示

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

xml 转换 dict(Python) 
  • 环境准备: pip install xmltodict
  • 依赖包版本: 0.13
import xmltodict
import requests


def test_xml_dict():
    """
    xml转换为json
    :return:
    """
    res = requests.get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss")
    dict_res = xmltodict.parse(res.text)
    print(dict_res)
    print(type(dict_res))
多协议封装(Python) 
import requests
import xmltodict
from requests import Response


def response_dict(response: Response):
    res_text = response.text
    if res_text.startswith("<?xml"):
        final_dict = xmltodict.parse(res_text)
    elif res_text.startswith("<!DOCTYPE html>"):
        final_dict = "html"
    else:
        final_dict = response.json()
    return final_dict


def test_response_dict():
    # xml
    # res = requests.get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss")
    # json
    res = requests.get("https://httpbin.ceshiren.com/get", verify=False)
    final_res = response_dict(res)
    print(type(final_res))
    print(final_res)
    assert isinstance(final_res, dict)

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1130356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决LOGITECH 罗技驱动 MAC版出现的一些问题汇总!

安装前将之前的安装文件清理干净&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 罗技驱动最新安装包下载 我的鼠标是G304 1. 驱动安装一直卡在99% 运行官方下载的安装程序&#xff0c;卡住后关掉窗口。 在终端中执行以下命令&#xff1a; sudo /Users/用户名…

HarmonyOS第一课运行Hello World

前言 俗话说&#xff0c;工欲善其事必先利其器。鸿蒙第一课&#xff0c;我们先从简单的Hello World运行说起。要先运行Hello World&#xff0c;那么我们必须搭建HarmonyOS的开发环境。 下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&a…

FoLR:Focus on Local Regions for Query-based Object Detection论文学习笔记

论文地址&#xff1a;https://arxiv.org/abs/2310.06470 自从DETR问询式检测器首次亮相以来&#xff0c;基于查询的方法在目标检测中引起了广泛关注。然而&#xff0c;这些方法面临着收敛速度慢和性能亚优等挑战。值得注意的是&#xff0c;在目标检测中&#xff0c;自注意力机制…

NanoPC-T4 RK3399:DTS之io-domain,FAN

前言: 之后所有改动均是基于rk3399-evb.dts修改以满足NanoPC-T4功能正常。 NanoPC-T4开发板上有一片散热风扇,本章将讲述使风扇正常工作起来的多种方法。 一:硬件分析 GPIO4_C6/PWM1:实际控制风扇引脚,GPIO与PWM复用 输入高电平1:FAN2pin电路导通,风扇转动 输入低电…

dc8靶机攻略

dc8 扫描 渗透 先访问主页探查 该主页的url看似存在sql注入 断点注入一下看看有没有报错 发现报错&#xff0c;存在sql注入 使用sqlmap 爆库 sqlmap -u http://10.4.7.151 -current-db爆表 sqlmap -u http://10.4.7.151/?nid2 --tables -D "d7db"发现user表 …

【Unity3D】Unity与Android交互

1 Unity 发布 apk 1.1 安装 Android Build Support 在 Unity Hub 中打开添加模块窗口&#xff0c;操作如下。 选择 Android Build Support 安装&#xff0c;如下&#xff08;笔者这里已安装过&#xff09;。 创建一个 Unity 项目&#xff0c;依次点击【File→Build Settings→…

Office技巧(持续更新)(Word、Excel、PPT、PowerPoint、连续引用、标题、模板、论文)

1. Word 1.1 标题设置为多级列表 选住一级标题&#xff0c;之后进行“定义新的多级列表” 1.2 图片和表的题注自动排序 正常插入题注后就可以了。如果一级标题是 “汉字序号”&#xff0c;那么需要对题注进行修改&#xff1a; 从原来的 图 { STYLEREF 1 \s }-{ SEQ 图 \* A…

3,4,6,9,?,18

3,4,6,9,?,18 逐步变大的递增数组 分析一&#xff1a; 3 6 -1 4 x 2 4 9 -1 6 x 2 6 &#xff1f; -1 9 x 2 &#xff1f; 13 9 18 -1 &#xff1f; x 2 &#xff1f; 13 分析二&#xff1a; 4 - 3 1 6 - 4 2 9 - 6 3 &#xff1f;- 9 4 …

CPU眼里的C/C++: 1.3 汇编级单步调试函数执行过程

1. 目的 2. 基于 GDB 的汇编级单步调试 原始代码 #include <stdio.h>long test() {long a 1;a 2;return a; }int main() {int ret test();printf("test return %d\n", ret);return 0; }关键 gdb 命令 si 指令执行汇编级的单步调试info registers 读取寄…

黑豹程序员-架构师学习路线图-百科:API接口测试工具Postman

文章目录 1、为什么要使用Postman&#xff1f;2、什么是Postman&#xff1f; 1、为什么要使用Postman&#xff1f; 目前我们开发项目大都是前后端分离项目&#xff0c;前端采用h5cssjsvue基于nodejs&#xff0c;后端采用java、SpringBoot、SSM&#xff0c;大型项目采用SpringC…

设计模式(五)—— 建造者模式/生成器模式

先简单记一下&#xff0c;以后再来认真写 还是造房子那个例子&#xff0c;一个房子分为①打地基 ② 砌墙 ③封顶三步&#xff0c;如果不用设计模式去写的话。就是一个超类&#xff0c;然后多个子类继承超类去重写 但是这样有两个缺点&#xff1a; &#xff08;1&#xff09;产…

centos服务器搭建安装Gitlab教程使用教程

1、更新服务器&#xff1a; sudo yum update -y && sudo yum upgrade -y 2、下载Gitlab的RPM包 https://packages.gitlab.com/gitlab/gitlab-cece表示开源el表示centos 选64位el8对应CentOS8 本教程以centos8为例&#xff0c;在服务器中&#xff0c;下载centos8的…

JS操作DOM及CSS

JS创造于1994年&#xff0c;其目的是为浏览器显示的文档赋予动态行为。 1 Web编程基础 本节讲解如何编写Web应用中的js程序&#xff0c;如果将这些程序加载到浏览器&#xff0c;以及如何获取输入、产出输出&#xff0c;如何运行响应事件的异步代码。 1.1 js 脚本 虽然现在不…

2023 10月最新Vmd 下载安装教程,WindowsLinux

文章目录 下载Vmdwindows版本安装LINUX版本安装 下载Vmd 谷歌搜索VMD 点击左下角download VMD 可选择对应版本 注&#xff1a;点击后会出现输入用户名和密码&#xff0c;由于我已注册&#xff0c;界面不见了&#xff0c;所以直接描述一下。 输入用户名和密码然后会出现让登记…

(ubuntu)安装nginx

文章目录 前言回顾Linux命令在线安装&#xff1a;相关命令&#xff1a;相关路径常用配置&#xff1a; 卸载nginxbug相关: 前言 提示&#xff1a;别再问我的规划是什么了&#xff1a;呼吸&#xff0c;难道不算一个吗&#xff1f; --E.M齐奥朗 回顾Linux命令 # 查看当前进程的所…

Boundary-Aware RGBD Salient Object Detection With Cross-Modal Feature Sampling

方法 体会 实验做得比较详细&#xff0c;但未公布代码

面试题总结 20231024

1.桶排序的应用案例&#xff1a;上亿元素排行榜 step1: 桶排序本质是一种分治算法 step2:每个桶都代表了一个元素的范围 step3:每个桶中的元素都排好序后&#xff0c;取出来&#xff0c;这样子就有序了 2.简述你们框架中用到的线程模型 1.actor思想(单线程处理) 2.xdb加锁(类…

T01西门子#DPRD_DAT

关键字&#xff1a;无系统常数&#xff1b;目前没有可显示的系统常数&#xff1b;没有设备标识符。 西门子300PLC在博图V15.1中是没有系统常数&#xff0c;没有设备标识符。 在博图V15.1中使用DPRD_DAT时&#xff0c;LADDR参数如何选择&#xff1f; LADDR为待读取数据的 模块的…

CSAPP 练习题 2.25

#include<stdio.h>float sum_elements(float a[], unsigned length) {int i;float result 0;for (i 0; i < length-1; i) {result a[i];}return result; }int main() {float a[0];printf("array sum: %f\n", sum_elements(a, 0)); } 调整代码后&#xff…

ChatGLM系列一——ChatGLM的介绍与使用

下面是官方对ChatGLM的介绍&#xff1a; ChatGLM-6B&#xff0c;结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最低只需 6GB 显存&#xff09;。经过约 1T 标识符的中英双语训练&#xff0c;辅以监督微调、 反馈自助、人类反…