接口对象封装思想及实现-笔记

目录

  • 接口对象封装
    • 代码分层思想
  • 封装案例
    • 封装Tpshop商城登录
    • Tpshop商城登录参数化
  • 接口自动化测试框架

接口对象封装

代码分层思想

在这里插入图片描述
分层思想:将普通思想分为两层,分为接口对象层和测试脚本层
接口对象层:
对接口进行封装,封装好之后,给测试用例调用
面向对象来封装实现
测试用例层:
调用接口对象层封装的方法,拿到响应结果,断言进行接口测试
借助unittest框架实现
封装思想:
将动态变化的数据,设计到方法的参数
将固定不变的,直接写成方法实现
将响应结果,通过返回值传出

封装案例

封装Tpshop商城登录

接口封装

class LoginApi:
    #发送验证码请求
    @classmethod      #类方法,不用创建实例,可直接类名调用
    def get_verify(cls,session):
        session.get(url='url地址')   #url地址是固定不变的
    #发送登录请求
    @classmethod
    def post_login(cls,session,data):
        resp=session.post(url='url地址',data=data)
        return resp

断言封装

class AssertFeizhuang:
    def common_assert(self,resp,status_code,status,msg):
        self.assertEquel(status_code, resp.status_code)
        self.assertEquel(status, resp.json().get("status"))
        self.assertEqual(msg, resp.json().get("msg"))

用例优化(前置方法提取)

import unittest
from assert_feizhuang import AssertFeizhuang
from login_api import LoginApi
from assert_feizhuang import AssertFeizhuang

class TestLogin(unittest.TestCase):
    session=None
    @classmethod
    def setUpClass(cls):
        cls.session = requests.session()
    def setUp(self):
        # 获取验证码
        LoginApi.get_verify(self.session)
    def test_login_01(self):
        """登录成功"""
        #登录
        data={"username":"13800000002","password":"123456","verifyCode":"8888"}
        resp=LoginApi.post_login(self.session,data)
        #断言
        AssertFeizhuang.common_assert(self,resp,200,1,"登录成功")
    def test_login_02(self):
        """手机号不存在"""
        # 登录
        data = {"username": "13800123002","password": "123456","verifyCode": "8888"}
        resp = LoginApi.post_login(self.session, data)
        # 断言
        AssertFeizhuang.common_assert(self, resp, 200, -1, "账号不存在")
    def test_login_03(self):
        """密码错误"""
        # 登录
        data = {"username": "13800000002","password": "000000","verifyCode": "8888"}
        resp = LoginApi.post_login(self.session, data)
        # 断言
        AssertFeizhuang.common_assert(self, resp, 200, -1, "密码错误")

Tpshop商城登录参数化

参数化实现步骤:
1.导包from parameterized import parameterized
2.在需要参数的方法前一行添加@parameterized.expand(数据)
3.给expand()传入数据,数据格式[(),(),()]
4.修改需要参数的方法,添加形参,个数、顺序与传入数据()的所有key一一对应
5.在通用测试方法内,使用形参
json数据文件

[{
  "data": {"username":"13800000002","password":"123456","verifyCode":"8888"},
  "status_code": 200,
  "status": 1,
  "msg": "登录成功"
},{
  "data": {"username":"13800123002","password":"123456","verifyCode":"8888"},
  "status_code": 200,
  "status": -1,
  "msg": "账号不存在"
}, {
  "data": {"username":"13800000002","password":"000000","verifyCode":"8888"},
  "status_code": 200,
  "status": 1,
  "msg": "密码错误"}]

读取数据

import json
def get_data(file):
    with open(file,'r',encoding='utf-8') as f:
        list=json.load(f)
        list1=[]
        for i in list:
            list1.append(tuple(i.values()))
    return list1

参数化后用例

import unittest
import requests
from parameterized import parameterized
from get_data import get_data
from login_api import LoginApi
from assert_feizhuang import AssertFeizhuang

class TestLogin(unittest.TestCase):
    session=None
    @classmethod
    def setUpClass(cls):
        cls.session = requests.Session()
    def setUp(self):
        # 获取验证码
        LoginApi.get_verify(self.session)
    @parameterized.expand(get_data('./login.json'))
    def test_login_01(self,data,status_code,status,msg):
        """登录成功"""
        print(data,status_code,status,msg)
        #登录
        resp=LoginApi.post_login(self.session,data)
        #断言
        AssertFeizhuang.common_assert(self,resp,status_code,status,msg)

接口自动化测试框架

在这里插入图片描述
接口自动化框架设计思路
1.搭建基础框架:定义项目目录结构,安装依赖包
2.通用功能类封装:数据库工具类
3.用例基础代码:封装接口API对象和UnitTest框架编写测试脚本
4.测试数据参数化:测试数据json文件设计、参数化实现
5.用例组织运行:组织测试用例运行,生成测试报告
搭建基础框架:定义项目目录结构
apiTestFramework #项目名称
api #定义封装被测系统的接口
scripts #定义测试用例脚本
data #存放测试数据文件
report #存放生成的测试报告
common #存放通用工具类
config.py #定义项目的配置信息
run_suite.py #执行测试套件的入口
实现
代码实现和上面一样,只是放入了目录中,让后导入的时候from 文件名 import 类中的文件名要加上对应文件名.
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】5. 贪心算法:买卖股票时机

太久没更了,抽空学习下。 看一道简单题。 class Solution:def maxProfit(self, prices: List[int]) -> int:cost -1profit 0for i in prices:if cost -1:cost icontinueprofit_ i - costif profit_ > profit:profit profit_if cost > i:cost iret…

微信小程序调用企业微信客户服务插件联通企业微信客服

需求背景:用户在小程序页面点击按钮添加企业微信的客服 相关技术:基于uniapp开发的微信小程序 插件名称:企业微信客户服务插件「联系我」插件 - 文档 - 企业微信开发者中心 仔细阅读文档「联系我」插件 - 文档 - 企业微信开发者中心 以下是我的实例代码 1.首先先小程序管…

大数据数仓实战项目(离线数仓+实时数仓)2

目录 1.课程目标和课程内容介绍 2.数仓维度建模设计 3.数仓为什么要分层 4.数仓分层思想和作用 5.数仓中表的种类和同步策略 6.数仓中表字段介绍以及表关系梳理 订单表itcast_orders 订单明细表 itcast_order_goods 商品信息表 itcast_goods 店铺表 itcast_shops 商…

【Android】jni开发之导入opencv和libyuv来进行图像处理

做视频图像处理时需要对其进行水印的添加,放在应用层调用工具性能方面不太满意,于是当下采用opencvlibyuv方法进行处理。 对于Android的jni开发不是很懂,我的需求是导入opencv方便在cpp中调用,但目前找到的教程都是把opencv作为模…

理解 C 与 C++ 中的 const 常量与数组大小的关系

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯数组大小的常量要求💯C 语言中的数组大小要求💯C 中的数组大小要求💯为什么 C 中 const 变量可以作为数组大小💯进一步的…

小菜鸟系统学习Python第六天

1.函数: 2.全局变量加global(这里博主记混了,global使用的时候不能赋值,然后就错了两回) 3.内嵌函数 4.闭包 存在嵌套函数:在一个函数内部定义另一个函数。内部函数引用外部函数的变量:内部函数使用了外部函数作用域中的变量。外部函数返回内部函数&…

【STM32系列】利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程)

ps.源码放在最后面 设计FIR数字滤波器可以看这里:利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程) 设计IIR滤波器 MATLAB配置 设计步骤 首先在命令行窗口输入"filterDesigner",接着就会跳出以下界面&#xf…

WSL2中安装的ubuntu搭建tftp服务器uboot通过tftp下载

Windows中安装wsl2,wsl2里安装ubuntu。 1. Wsl启动后 1)Windows下ip ipconfig 以太网适配器 vEthernet (WSL (Hyper-V firewall)): 连接特定的 DNS 后缀 . . . . . . . : IPv4 地址 . . . . . . . . . . . . : 172.19.32.1 子网掩码 . . . . . . . .…

ES冷热数据分离配置

冷热数据是根据索引创建时间来进行迁移的。一旦迁移到冷数据节点,则无法再恢复成热数据,因为热数据节点中该索引已经没有分片存在了。 基于Docker搭建ES集群,并设置冷热数据节点 配置冷热数据迁移策略 PUT https://192.168.x.xx:19200/_ilm/policy/my…

Javaweb学习日记(十一)Mybatis-基础操作

一、环境准备 二、基础操作-删除 日志输出: SQL注入: sql注入:例如一个登录页面,需要满足账号密码同时匹配数据库内的数据才可登录(点击登录也页面在后台生成一条sql语句去检验是否正确(通过判断sql语句返…

小程序-基础加强

前言 这一节把基础加强讲完 1. 导入需要用到的小程序项目 2. 初步安装和使用vant组件库 这里还可以扫描二维码 其中步骤四没什么用 右键选择最后一个 在开始之前,我们的项目根目录得有package.json 没有的话,我们就初始化一个 但是我们没有npm这个…

Spring @PropertySource:让你的应用配置更加模块化和可维护

PropertySource注解在Spring中的作用,就像是给Spring应用配了一个“外部配置箱”。 想象一下,你在开发一个Spring应用时,有很多配置信息需要设置,比如数据库的连接信息、应用的某些功能开关等。如果这些信息都硬编码在代码中&…

尝试在Excel里调用硅基流动上的免费大语言模型

我个人觉得通过api而不是直接浏览器客户端聊天调用大语言模型是使用人工智能大模型的一个相对进阶的阶段。 于是就尝试了一下。我用的是老师木 袁进辉博士新创的硅基流动云上的免费的大模型。——虽然自己获赠了不少免费token,但测试阶段用不上。 具体步骤如下&am…

问卷数据分析|SPSS之分类变量描述性统计

1.点击分析--描述统计--频率 2. 选中分类变量,点击中间箭头 3.图表选中条形图,图表值选择百分比,选择确定 4.这里显示出了描述性统计的结果 5.下面就是图形,但SPSS画的图形都不是很好啊看,建议用其他软件画图&#xff…

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (上)

今天小李哥将开启全新的技术分享系列,为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来,生成式 AI 安全市场正迅速发展。据 IDC 预测,到 2025 年全球 AI 安全解决方案市场规模将突破 200 亿美元,年复合增长率超过 30%…

LQB(0)-python-基础知识

一、Python开发环境与基础知识 python解释器:用于解释python代码 方式: 1.直接安装python解释器 2.安装Anaconda管理python环境 python开发环境:用于编写python代码 1.vscode 2.pycharm # 3.安装Anaconda后可以使用网页版的jupyter n…

SQL Server 数据库备份指南

SQL Server备份是数据库维护的日常工作。备份的目的是在发生数据丢失、损坏甚至硬件故障时将数据库和事务日志恢复到最近的时间点。您可以借助专业的SQL Server备份软件,操作起来更方便。前提需要安装SQL Server Management Studio (SSMS)工具。 对于 SQL 数据库备份,有多种…

常见Linux命令的复习

常见命令 ls 列出工作目录 ls -l:以长格式显示目录下的文件和子目录信息。ls -a:显示所有文件和子目录,包括隐藏文件 ll 列出该目录下的详细信息 看到该目录下的所有目录和文件的详细信息 cd 切换当前工作目录里 cd /path/to/directory&…

spring aop失效场景

aop基于代理(jdk动态代理 / cglib代理)实现,即new了新的类实例,代理了原来的定义的类实例。 目录 1. final修饰的方法无法被代理2. 静态方法无法被代理3. 内部方法调用,即this.method()无法被代理4. 私有方法不能代理5…

PostgreSQL函数自动Commit/Rollback所带来的问题

一、综述 今天在PostgreSQL遇到一个奇怪的现象,简而言之,是想用函数(存储过程)实现插入记录,整个过程没报错但事后却没找到记录!忙活半天,才发现原因是PostgreSQL函数(存储过程&…