当前位置: 首页 > article >正文

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

目录

  • 接口对象封装
    • 代码分层思想
  • 封装案例
    • 封装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 类中的文件名要加上对应文件名.
在这里插入图片描述


http://www.kler.cn/a/535371.html

相关文章:

  • 【BUUCTF逆向题】[MRCTF2020]Transform
  • Linux系统 环境变量
  • 【漫话机器学习系列】076.合页损失函数(Hinge Loss)
  • 6种MySQL高可用方案对比分析
  • 在C#中,Array,List,ArrayList,Dictionary,Hashtable,SortList,Stack的区别
  • 导入了fastjson2的依赖,但却无法使用相关API的解决方案
  • Servlet笔记(下)
  • 数据结构与算法学习笔记----博弈论
  • [转]Java面试近一个月的面试总结
  • ElasticSearch业务场景与面试题
  • PCA9685舵机控制板使用
  • OpenBMC:通过qemu-system-arm运行编译好的image
  • Windows编程:下载与安装 Visual Studio 2010
  • 深度学习 - 神经网络的原理
  • 基于多重算法的医院增强型50G全光网络设计与实践:构建智慧医疗新基石(下)
  • SpringAI介绍及本地模型使用方法
  • 【实战篇】巧用 DeepSeek,让 Excel 数据处理更高效
  • 【Ubuntu】ARM交叉编译开发环境解决“没有那个文件或目录”问题
  • DeepSeek模型构建与训练
  • 云计算——AWS Solutions Architect – Associate(saa)1、什么是云,AWS介绍
  • 网络爬虫js逆向之异步栈跟栈案例
  • Flink-WordCount源码解析
  • OpenGL学习笔记(十):初级光照:材质 Materials
  • DEEPSEKK GPT等AI体的出现如何重构工厂数字化架构:从设备控制到ERP MES系统的全面优化
  • 新星杯进化史:个人发起到CSDN官方支持,创作活动的新篇章
  • 从零手写Spring IoC容器(一):传统对象管理的困境与基础容器的实现