Python-代码封装思想

news2024/10/7 4:31:03

继上文所将讲的python+requests+Unittest框架,本文将继续分享python代码的进一步封装思想,来提高代码的整体运行效率及整洁性,本文以接口测试框架为例进行讲解。

关于Unittest单元测试框架的具体使用方法链接链接(点击跳转)↓

API自动化测试-Python+requests+unittest框架介绍icon-default.png?t=M85Bhttps://blog.csdn.net/Liu_GuoXing/article/details/127526943


 接口测试框架目录:

  • api:存放我们自己封装的API接口
  • script:存放python代码,借助unittest框架,调用自己封装的API
  • data:存放数据文件,如用于参数化的数据
  • report:存放生成的测试报告
  • lib:存放第三方库
  • app.py:存放全局数据、公共变量
  • utils.py:存放工具函数、方法
  • run_suite.py:存放批量执行用例,生成测试报告的代码

封装登录接口思路:

  1. 先按普通方式实现HTTP请求
  2. 将请求 封装成自己定义个API接口(存入api中)
  3. 调用自己封装的API,实现接口测试(结合Unittest框架,写入到script)

整体思想:

  • 将固定不变的数据,直接写入到封装的类属性和方法中
  • 将动态变化的数据,通过参数或返回值传递

分析:

  • session:是需要创建而产生的---动态变化的
  • get()方法:不变
  • 获取验证码的url:不变
  • 获取验证码的resp:做返回值进行传出--动态变化的(传出)
  • post()方法:不变
  • 登录的url:不变
  • 登录的headers:不变
  • 登录的data:做参数---动态变化的(传入)
  • 登录的resp:做返回值进行传出--动态变化的(传出)

封装代码:

1.在api目录下创建login_api.py文件

# 在api目录下创建login_api.py
# 创建类
class Login_Api:
    # 定义属性
    def __init__(self):
        self.url_verify = 'xxxx'
        self.url_login = 'xxxxx'
        self.headers = 'xxxx'

    # 定义方法-获取验证码
    def get_verify(self, my_session):
        return my_session.get(url=self.url_verify)

    # 定义方法-登录
    def login(self, my_session, req_data):
        return my_session.post(url=self.url_login, headers=self.headers, data=req_data)

2.在script目录中创建测试类文件,从unittest.Testcase类继承并添加setUpClass及tearDownClass和普通方法

# 在script中创建test_login.py
import unittest

import requests

from api.login_api import Login_Api
# 导包

class LgxLogin(unittest.TestCase):
    my_session = None

    @classmethod
    def setUpClass(cls) -> None:
        cls.login_api = Login_Api()
        # 调用自己封装的类
        cls.my_session = requests.Session()

    @classmethod
    def tearDownClass(cls) -> None:
        cls.my_session.close()

    def test01_login_ok(self):
        # 登录成功
        # 调用自己封装的方法获取验证码
        resp_verify = self.login_api.get_verify(self.my_session)
        # 调用自己封装的方法实现登录
        req_data = 'xxxxx'
        resp_login = self.login_api.login(self.my_session, req_data)
        # 打印响应结果
        print(resp_login)
        # 增加断言-响应状态码
        self.assertEqual(200, resp_login.status_code)
        # 增加断言-响应体msg的值为登录成功
        self.assertIn('登录成功', resp_login.json().get('msg'))

    def test02_username_not_exits(self):
        # 用户名不存在
        # 调用自己封装的方法获取验证码
        resp_verify = self.login_api.get_verify(self.my_session)
        # 调用自己封装的方法实现登录
        req_data = 'AAAAAA'
        resp_login = self.login_api.login(self.my_session, req_data)
        # 打印响应结果
        print(resp_login)
        # 增加断言-响应状态码
        self.assertEqual(200, resp_login.status_code)
        # 增加断言-用户名不存在
        self.assertIn('用户名不存在', resp_login.json().get('msg'))

    def test03_pwd_error(self):
        # 密码错误
        # 调用自己封装的方法获取验证码
        resp_verify = self.login_api.get_verify(self.my_session)
        # 调用自己封装的方法实现登录
        req_data = 'BBBBB'
        resp_login = self.login_api.login(self.my_session, req_data)
        # 打印响应结果
        print(resp_login)
        # 增加断言-响应状态码
        self.assertEqual(200, resp_login.status_code)
        # 增加断言-响应体msg的值为密码错误
        self.assertIn('密码错误', resp_login.json().get('msg'))

进一步优化:

  • 将http协议和域名,写入到app.py文件中,当做一个全局变量来存储
  • 将headers存储到app.py文件中,当做一个全局变量来存储
  • 使用到全局变量时导包引用即可

以上就是本文的全部内容了,合理利用封装思想,可以时数据动态管理,应对域名、协议等共用的信息变化时可以通过直接公共方法里的属性值进行全局修改,如有疑问欢迎评论区留言讨论。


关注我,不迷路

******我的本文相关专栏******

软件测试 & 开发(单击此处进入)


 ******我的其它作品专栏******

PC常见故障汇总专栏(点击进入)

EXCEL综合场景应用详解(点击此处进入)

全国计算机等级考试-二级python基础(点击此处进入)

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

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

相关文章

MMEngine理解

MMEngine理解1 简介1.1 架构1.2 模块介绍1.2.1 核心模块与相关组件1.2.1 公共基础模块2 上手示例2.1 构建模型2.2 构建数据集和数据加载器2.3 构建评测指标2.4 构建执行器并执行任务3. 基础模块3.1 注册器(Registry)3.1.1 什么是注册器3.1.2 使用流程3.1…

OSPF路由协议(二)

作者介绍: ⭐️作者:小刘在C站 ❄️每天分享课堂笔记,一起努力,共赴美好人生! ☁️夕阳下,是最美的绽放。 目录 一.Router id 二.DR,BDR 三.DR BDR 选举过程 四.ospf 度量值 cost 代价 五.ospf 的数据…

部署vue项目到阿里云服务器

一般前端工程师只会使用npm run serve 在开发环境下验证,那么如何把npm run build 打出的包部署到服务器上进行上线呢?这篇文章就详细阐述这一流程。 1. 购买或试用阿里云服务器 作为新用户可以试用一个月阿里云服务器,阿里云官方网址如下&a…

【数据结构与算法分析】0基础带你学数据结构与算法分析07--二叉树

在学习上一章后,我们对树加以限制,如果树的度为 2,那么就称这颗树为 二叉树 (binary tree)。 二叉树的性质 在一棵二叉树上,有一些重要的性质: 第 i 层 (i∈N) 上最多有 2^(i−1) 个结点层次为 k(k∈N) 的树最多有 …

进程地址空间

目录 程序地址空间 感知虚拟地址空间的存在 进程地址空间 分页 & 虚拟地址空间 Linux2.6内核进程调度队列 程序地址空间 我们在学习C语言的时候了解过程序地址空间的分布: 需要注意的是:程序地址空间不是内存。我们在linux操作系统中通过代码来…

刷题笔记之二(字符串中找出连续最长的数字串+数组中出现次数超过一半的数字+另类加法+计算糖果+进制转换)

目录 1. 多层继承问题 2. 继承中子类的构造要引用super 3. 比较地址 4. 字符串中找出连续最长的数字串(编程题) 5. 数组中出现次数超过一半的数字(编程题) 6. 另类加法(编程题) 7. Interface 接口中定义方法 8. 实现或继…

C语言学习(二)之字符串和格式化输入/输出

文章目录一、字符串二、 输入2.1 scanf()作用2.2 两种用法三、输出3.1 printf()3.1.1 printf 四种用法3.1.2 常用输出控制符3.1.3 为什么需要输出控制符一、字符串 字符串是一个或多个字符的序列。如:“Hello World” 双引号不是字符串的一部分。仅告知编译器它括…

【学习笔记】《深入浅出Pandas》第16章:可视化

文章目录16.1 plot方法16.1.1 plot概述16.1.2 plot基础方法16.1.3 图形类型16.1.4 x轴和y轴16.1.5 图形标题16.1.6 字体大小16.1.7 线条样式16.1.8 背景辅助线16.1.9 图例16.1.10 图形大小16.1.11 色系16.1.12 绘图引擎16.1.14 图形叠加16.1.15 颜色的表示16.1.16 解决图形中的…

量子笔记:量子计算 toy python implementation from scratch

目录 0. 概要 1. 量子比特表示:用二维张量表示 2. 张量积的实现 2.1 用scipy.linalg.kron()实现张量积 2.2 用张量积计算双量子系统的基 3. 多量子系统基向量表示和生成 3.1 Helper function: bin_ext 3.2 多量子系统的基的生成 3.3 numpy.matrix numpy.m…

基于多尺度注意力网络单图像超分(MAN)

引言 Transformer的自注意力机制可以进行远距离建模,在视觉的各个领域表现出强大的能力。然而在VAN中使用大核分解同样可以得到很好的效果。这也反映了卷积核的发展趋势,从一开始的大卷积核到vgg中采用堆叠的小卷积核代替大卷积核。 上图展现了MAN网络在…

使用T0,方式2,在P1.0输出周期为400µs,占空比为4:1的矩形脉冲,要求在P1.0引脚接有虚拟示波器,观察P1.0引脚输出的矩形脉冲波形

大家学过一段时间的单片机了,今天我们来说说单片机里的定时器,又叫计数器。首先,我们通过案例来了解一下什么是定时器。 【例】使用T0,方式2,在P1.0输出周期为400s,占空比为4:1的矩形脉冲&…

如何编写优秀的测试用例,建议收藏和转发

1、测试点与测试用例 测试点不等于测试用例,这是我们首先需要认识到的。 问题1:这些测试点在内容上有重复,存在冗余。 问题2:一些测试点的测试输入不明确,不知道测试时要测试哪些。 问题3:总是在搭相似…

串口通信协议【I2C、SPI、UART、RS232、RS485、CAN】

(1)I2C 集成电路互连总线接口(Inter IC):同步串行半双工传输总线,连接嵌入式处理器及其外围器件。 支持器件:LCD驱动器、Flash存储器 特点: ①有两根传输线(时钟线SCL、双向数据线SDA&#…

python基础19-36题

题目: 代码十九二十二十一二十二二十三二十四二十五二十六二十七二十八二十九三十三十一三十二三十三三十四三十五三十六十九 birthday int(input(“请输入生日日期:”)) Set1 [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31] Set2 [2,3,6,7,10,11,…

【CV】第 7 章:目标检测基础

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

几何等变图神经网络综述

许多科学问题都要求以几何图形(geometric graphs)的形式处理数据。与一般图数据不同,几何图显示平移、旋转和反射的对称性。研究人员利用这种对称性的归纳偏差(inductive bias),开发了几何等变图神经网络&a…

SpringMVC | 快速上手SpringMVC

👑 博主简介:    🥇 Java领域新星创作者    🥇 阿里云开发者社区专家博主、星级博主、技术博主 🤝 交流社区:BoBooY(优质编程学习笔记社区) 前言:在上一节中我们了解…

多分类评估指标计算

文章目录混淆矩阵回顾Precision、Recall、F1回顾多分类混淆矩阵宏平均(Macro-average)微平均(Micro-average)加权平均(Weighted-average)总结代码混淆矩阵回顾 若一个实例是正类,并且被预测为正…

Linux(Nginx)

目录 一、Nginx简介 二、Nginx使用 Nginx安装 tomcat负载均衡 Nginx配置 三、Nginx部署项目 项目打包前 将前端项目打包(测试本地项目打包后没问题) ip/host主机映射 完成Nginx动静分离的default.conf的相关配置 将前台项目打包(配合Nginx动静…

real-word super resulution: real-sr, real-vsr, realbasicvsr 三篇超分和视频超分论文

real-world image and video super-resolution 文章目录real-world image and video super-resolution1. Toward Real-World Single Image Super-Resolution:A New Benchmark and A New Model(2019)1.1 real-world数据集制作1.2 LP-KPN网络结构1.3 拉普拉…