数据驱动实战二

news2025/1/12 5:59:17

目标

  1. 掌握数据驱动的开发流程
  2. 掌握如何读取JSON数据文件
  3. 巩固PO模式

1. 案例

对TPshop网站的登录模块进行单元测试

1.1 实现步骤

  1. 编写测试用例
  2. 采用PO模式的分层思想对页面进行封装
  3. 编写测试脚本
  4. 定义数据文件,实现参数化

1.2 用例设计

 1.3 数据文件

{
 "login_username_is_null": {
 "username": "",
 "password": "123456",
 "code": "8888",
 "is_success": false,
 "expect": "用户名不能为空"
 },
 "login_password_is_null": {
 "username": "13012345678",
 "password": "",
 "code": "8888",
 "is_success": false,
 "expect": "密码不能为空"
 },
 "login_password_is_error": {
 "username": "13012345678",
 "password": "error",
 "code": "8888",
 "is_success": false,
 "expect": "密码错误"
 },
 "login_success": {
 "username": "13012345678",
 "password": "123456",
 "code": "8888",
 "is_success": true,
 "expect": "我的账户"
 }
}

1.4 示例代码

from selenium import webdriver
def get_tips_msg():
 """
 获取弹出框的提示消息
 :return: 消息文本内容
 """
 msg = DriverUtil.get_driver().find_element_by_class_name("layui-layer-content").tex
t
 return msg
class DriverUtil:
 """
 浏览器驱动工具类
 """
 _driver = None
 @classmethod
 def get_driver(cls):
 """
 获取浏览器驱动对象,并完成初始化设置
 :return: 浏览器驱动对象
 """
 if cls._driver is None:
 cls._driver = webdriver.Firefox()
 cls._driver.maximize_window()
 cls._driver.implicitly_wait(10)
 cls._driver.get("http://localhost")
 return cls._driver
 @classmethod
 def quit_driver(cls):
 """
 关闭浏览器驱动
 """
 if cls._driver:
 cls._driver.quit()
 cls._driver = None
# login_page.py
from selenium.webdriver.common.by import By
from ddt.tpshop.utils import DriverUtil
class LoginPage:
 """
 登录页面-对象库层
 """
 def __init__(self):
 self.driver = DriverUtil.get_driver()
 # 用户名输入框
 self.username = (By.ID, "username")
 # 密码
 self.password = (By.ID, "password")
 # 验证码
 self.verify_code = (By.ID, "verify_code")
 # 登录按钮
 self.login_btn = (By.NAME, "sbtbutton")
 def find_username(self):
 return self.driver.find_element(*self.username)
 def find_password(self):
 return self.driver.find_element(*self.password)
 def find_verify_code(self):
 return self.driver.find_element(*self.verify_code)
 def find_login_btn(self):
 return self.driver.find_element(*self.login_btn)
class LoginHandle:
 """
 登录页面-操作层
 """
 def __init__(self):
 self.login_page = LoginPage()
 def input_username(self, username):
 self.login_page.find_username().send_keys(username)
 def input_password(self, pwd):
 self.login_page.find_password().send_keys(pwd)
 def input_verify_code(self, code):
 self.login_page.find_verify_code().send_keys(code)
 def click_login_btn(self):
 self.login_page.find_login_btn().click()
class LoginProxy:
 """
 登录页面-业务层
 """
 def __init__(self):
 self.login_handle = LoginHandle()
 def login(self, username, password, code):
 self.login_handle.input_username(username)
 self.login_handle.input_password(password)
 self.login_handle.input_verify_code(code)
 self.login_handle.click_login_btn()

# test_login.py
import json
import time
import unittest
from parameterized import parameterized
from ddt.tpshop import utils
from ddt.tpshop.page.login_page import LoginProxy
from ddt.tpshop.utils import DriverUtil
# 构建测试数据
def build_data():
 test_data = []
 with open("../data/testData.json", encoding='UTF-8') as f:
 json_data = json.load(f)
 for login_data in json_data.values():
 test_data.append((login_data.get("username"),
 login_data.get("password"),
 login_data.get("code"),
 login_data.get("is_success"),
 login_data.get("expect")))
 print("test_data=", test_data)
 return test_data
class TestLogin(unittest.TestCase):
 @classmethod
 def setUpClass(cls):
 cls.driver = DriverUtil.get_driver()
 cls.login_proxy = LoginProxy()
 @classmethod
 def tearDownClass(cls):
 DriverUtil.quit_driver()
 def setUp(self):
 # 进入首页
 self.driver.get("http://localhost")
# 点击登录链接
 self.driver.find_element_by_link_text("登录").click()
 @parameterized.expand(build_data)
 def test_add(self, username, password, code, is_success, expect):
 print('username={} password={} code={} is_success={} expect={}'.
 format(username, password, code, is_success, expect))
 # 登录
 self.login_proxy.login(username, password, code)
 time.sleep(3)
 # 登录成功的用例
 if is_success:
 self.assertIn(expect, self.driver.title)
 else:
 # 获取提示框消息
 msg = utils.get_tips_msg()
 print("msg=", msg)
 self.assertIn(expect, msg)

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

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

相关文章

JVM调优—减少FullGC

背景 最近负责了一个审批流程新项目,带领了几个小伙伴,哼哧哼哧的干了3个月左右,终于在三月底完美上线了,好消息是线上客户用的很丝滑,除了几个非常规的业务提单之外,几乎没有什么大的问题,但是…

4D 成像毫米波雷达:新型传感器助力自动驾驶

1 感知是自动驾驶的首要环节,高性能传感器必不可少 感知环节负责对侦测、识别、跟踪目标,是自动驾驶实现的第一步。自动驾驶的实现,首先要能够准确理解驾驶环境信息,需要对交通主体、交通信号、环境物体等信息进行有效捕捉&#x…

【静态分析】软件分析课程实验A4-类层次结构分析与过程间常量传播

官网:作业 4:类层次结构分析与过程间常量传播 | Tai-e 参考:https://www.cnblogs.com/gonghr/p/17984124 ----------------------------------------------------------------------- 1 作业导览 为 Java 实现一个类层次结构分析&#xf…

249 基于matlab的MED、OMEDA、MOMEDA、MCKD信号处理方法

基于matlab的MED、OMEDA、MOMEDA、MCKD信号处理方法。最小熵反褶积(MED),最优最小熵反卷积调整卷积 (OMEDA),多点最优最小熵解卷积调整(Multipoint Optimal Minimum Entropy Deconvolution Adjusted,MOMEDA),最大相关峭…

【智能优化算法】蜜獾优化算法(Honey Badger Algorithm,HBA)

蜜獾优化算法(Honey Badger Algorithm,HBA)是期刊“MATHEMATICS AND COMPUTERS IN SIMULATION”(IF 3.6)的2022年智能优化算法 01.引言 蜜獾优化算法(Honey Badger Algorithm,HBA)受蜜獾智能觅食行为的启发,从数学上发展出一种求解优化问题的…

vue3实现动态表格

vue3结合element-plus实现动态表格&#xff0c;可添加、删除、对单行数据判断。 实现效果&#xff1a;查看源代码 实现代码&#xff1a; <div class"arrTable-Box"><el-table :data"tableData" border max-height"250"><el-t…

【强训笔记】day17

NO.1 思路&#xff1a;用一个字符串实现&#xff0c;stoi函数可以转化为数字并且去除前导0。 代码实现&#xff1a; #include <iostream> #include<string> using namespace std;string s;int main() {cin>>s;for(int i0;i<s.size();i){if(s[i]%20) s[…

大模型模型简化机器人训练;简单易用的 3D 工具Project Neo;特斯拉放出了擎天柱机器人最新训练视频

✨ 1: DrEureka 利用大语言模型自动化将机器人仿真环境训练结果转移到真实世界 DrEureka是一种利用大型语言模型&#xff08;LLMs&#xff09;自动化和加速从仿真&#xff08;sim&#xff09;到现实世界&#xff08;real&#xff09;转移的技术。在机器人技能学习领域&#x…

网络编程套接字和传输层tcp,udp协议

认识端口号 我们知道在网络数据传输的时候&#xff0c;在IP数据包头部有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。IP地址是帮助我们在网络中确定最终发送的主机&#xff0c;但是实际上数据应该发送到主机上指定的进程上的&#xff0c;所以我们不仅要确定主机&…

MultiBoot 和 QuickBoot

目录 MultiBoot简介MultiBoot 实现方式设置 bitstream 属性使用 ICAPE2 原语WBSTAR 寄存器定义 MultiBoot 工作流程生成mcs固化文件 Tcl 指令Fallback状态寄存器MultiBoot 正常加载状态看门狗1超时状态看门狗2超时状态CRC 错误和无 DESYNC 命令IDCODE 错误状态CRC 错误状态 Wat…

【AMBA Bus ACE 总线 8 -- ICache maintenance】

请阅读【AMBA Bus ACE 总线与Cache 专栏 】 欢迎学习:【嵌入式开发学习必备专栏】 文章目录 ACE ICache maintenanceACE ICache maintenance 图 1-1 当一个OS run 多个cpu的时候,根据调度算法的不同,OS 可以根据调度算法的不同分别 run 在某个具体的CPU上,因此,它们会有…

Linux修炼之路之初识操作系统+基础指令(1)

目录 引言 一&#xff1a;对操作系统(OS)的简单了解 1.操作系统(OS) 是什么 2.操作系统好坏的衡量标准 3.操作系统存在的重要性 4.理解所有在计算机上的操作 二&#xff1a;Linux与windows操作的特点区别 三&#xff1a;基础指令 1.ls 指令 1.使用 2.常用选项 2.…

【C++语言】Date类的代码实现(操作符重载运用)

文章目录 前言Date类的构思Date类的相关实现基本框架&#xff08;默认成员函数&#xff09;计算n天前\后的日期补充&#xff1a;前置、后置说明判断两个日期的关系&#xff08;大于&#xff0c;小于等&#xff09;&#xff1b;可以计算两个日期之间相差多少天补充&#xff1a;流…

rbac权限和多级请假设计的流程演示和前端页面实现

登录账号&#xff1a;t6普通用户 t7部门经理 m8总经理 密码都为&#xff1a;test 多级请假&#xff1a;7级及以下申请请假需要部门经理审核&#xff0c;若是请假时长超过72小时&#xff0c;则需要总经理审核&#xff0c;7级申请请将需要总经理审核&#xff0c;总经理请假自动审…

VBA_NZ系列工具NZ06:VBA创建PDF文件说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

这3种深拷贝实现,你都知道吗?

目录&#xff1a; 1、JSON.parse 2、structuredClone 3、cloneDeep

Secure Transformer Inference Made Non-interactive

目录 1.概述2.Attention2.1 Matrix multiplication (ciphertext-plaintext).2.2 Matrix multiplication (ciphertext-ciphertext)2.3 Placement of bootstrapping3.SIMD密文压缩和解压缩4.SIMD槽折叠5.实验结果 1.概述 我们提出了NEXUS&#xff0c;这是第一个用于安全变压器推…

AI 产品经理和 AIGC 产品经理有什么区别,怎么选择

AI 产品经理和 AIGC 产品经理有什么区别&#xff0c;怎么选择&#xff1f; AI 和 AIGC 行业两个行业带动了产品经理的的能力提升&#xff0c;那AI产品经理与AIGC产品经理两者中间有什么区别的呢&#xff1f;下面一起来看一下&#xff0c;之间的不同之处吧&#xff01; 目前很火…

构建智能化组织架构权限管理系统:架构设计与实践

随着企业规模的扩大和信息化程度的提升&#xff0c;对权限管理的需求与重要性也日益凸显。本文将深入探讨智能化权限管理系统的架构设计&#xff0c;介绍其关键特点和最佳实践&#xff0c;助力企业提升组织架构的有效性、安全性和管理效率。 1. **需求分析与功能设计&#xff…

基于OpenCV对胸部CT图像的预处理

1 . 传作灵感 胸部CT中所包含的噪声比较多&#xff0c;基于OpenCV简单的做一些处理&#xff0c;降低后续模型训练的难度。 2. 图像的合成 在语义分割任务中有的时候需要将原图&#xff08;imput&#xff09;和标注数据&#xff08;groudtruth&#xff09;合成一幅图像&#x…