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

Python-代码封装思想

继上文所将讲的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基础(点击此处进入)

相关文章:

  • 基于MATLAB的指纹识别算法仿真实现
  • Spring Boot中异步消息JMS的讲解与通信实例
  • JeecgBoot 3.4.3-GA 版本发布,开源免费的企业级低代码平台
  • 代码随想录38——动态规划:动态规划理论基础、509斐波那契数列、70爬楼梯、746使用最小花费爬楼梯
  • 基于大数据平台的毕业设计01:基于Docker的HDP集群搭建
  • YOLOv5剪枝 | 模型剪枝理论篇 | 1/2
  • 结构体、枚举类型和联合体
  • 【兄弟反目成仇系列】:我只是写了一个爆炸信息窗口脚本,好兄弟追了我几条街~
  • 参加微软学生开发者峰会,了解Azure和GitHub……
  • 【数据结构练习题——查找】
  • imx6ull-arm开发板和电脑网线直连通信
  • 【目标检测】YOLOv5遇上知识蒸馏
  • 【每日渗透笔记】覆盖漏洞+修改隐藏数据实战尝试
  • 软件工程结构化设计
  • 异地远程群晖NAS教程【cpolar内网穿透】
  • @angular/forms 源码解析之双向绑定
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Android Studio:GIT提交项目到远程仓库
  • CAP理论的例子讲解
  •  D - 粉碎叛乱F - 其他起义
  • JavaScript HTML DOM
  • js算法-归并排序(merge_sort)
  • LeetCode18.四数之和 JavaScript
  • Protobuf3语言指南
  • tab.js分享及浏览器兼容性问题汇总
  • Vue小说阅读器(仿追书神器)
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 多线程 start 和 run 方法到底有什么区别?
  • 讲清楚之javascript作用域
  • 力扣(LeetCode)21
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 线性表及其算法(java实现)
  • 一些css基础学习笔记
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • kubernetes资源对象--ingress
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​数据链路层——流量控制可靠传输机制 ​
  • ​一些不规范的GTID使用场景
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (21)起落架/可伸缩相机支架
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C语言)字符分类函数
  • (LeetCode 49)Anagrams
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (九)c52学习之旅-定时器
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (十一)手动添加用户和文件的特殊权限
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)ORM
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)深入super,看Python如何解决钻石继承难题
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿