数据驱动实战二

目标

  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)

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

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

相关文章

STM32CubeMX学习笔记30---FreeRTOS内存管理

一、简介 1 基本概念 FreeRTOS 操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些内存管理函数是如何实现的,所以在 FreeRTOS 中提供了多种内存分配算法(分配策略)&#xf…

【Web】2023浙江大学生省赛初赛 secObj 题解

目录 step 0 step 1 step 2 step 3 题目本身是不难,简单复健一下 step 0 pom依赖就是spring 反序列化入口在./admin/user/readObj 输入流做了黑名单的过滤,TemplatesImpl不能直接打 可以jackson打SignedObject二次反序列化绕过 具体原理看下面这…

基于ESP32和ESP8266的物联网开发过程(二)

在做这个项目前,也做了一些调研。项目的初衷是想要用于智能家居。我比较了小米IoT、阿里云、ESPHOME、巴沙云、点灯科技和ONENET等几个平台。最终选择了Onenet,部分原因是之前用过它的多协议版本,但现在这个版本已经下线了。 小米IoT的公测名…

基于JAVAEE的停车场管理系统(论文 + 源码)

【免费】基于JAVAEE的停车场管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89292324 基于JAVAEE的停车场管理系统 摘 要 如今,我国现代化发展迅速,人口比例急剧上升,在一些大型的商场,显得就格外拥挤&…

深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略

🔥 个人主页:空白诗 文章目录 🔥 引言🧱 原型基础⛓️ 原型链的形成🔄 修改原型的影响🏁 原型链的尽头为什么null标志着结束?实际意义 🌐 🔄 继承的实现方式1. 原型链继承…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-11.1,11.2-BSP文件目录组织

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

基于SpringBoot的全国风景区WebGIS按省展示实践

目录 前言 一、全国风景区信息介绍 1、全国范围内数据分布 2、全国风景区分布 3、PostGIS空间关联查询 二、后台查询的设计与实现 1、Model和Mapper层 2、业务层和控制层设计 三、WebGIS可视化 1、省份范围可视化 2、省级风景区可视化展示 3、成果展示 总结 前…

【Vulhub靶场】Nginx 中间件漏洞复现

【Vulhub靶场】Nginx 中间件漏洞复现 一、Nginx 文件名逻辑漏洞(CVE-2013-4547)1. 影响版本2. 漏洞原理3. 漏洞复现 二、Nginx越界读取缓存漏洞(CVE-2017-7529)1. 漏洞详情2. 影响版本3. 漏洞复现 三、Nginx 配置错误导致漏洞&…

建发弘爱 X 袋鼠云:加速提升精细化、数字化医疗健康服务能力

厦门建发弘爱医疗集团有限公司(简称“建发弘爱”)创立于2022年,是厦门建发医疗健康投资有限公司的全资子公司,专业从事医疗健康领域的医疗服务。 建发弘爱通过医疗、健康及产业服务三大板块,为百姓提供医疗和健康全生…

【MySQL基本查询(下)】

文章目录 一、update案例 二、Delete案例注意:delete 全表数据的行为慎用!truncate 三、插入查询结果案例 四、了解一些函数1.count函数2.sum函数3. avg函数4.max函数5. min函数 五、group by子句的使用案例having和where 一、update 该关键字的功能就是…

k8s遇到的常见问题及解决

1. error: open /var/lib/kubelet/config.yaml: no such file or directory 解决:关键文件缺失,多发生于没有做 kubeadm init就运行了systemctl start kubelet。 要先成功运行kubeadm init 2. 执行初始化kubeadm init ------的时候报错 The HTTP call…

(Mac)RocketMQ的本地安装测试(详细图示)

目录 部署服务 namesrv / broker下载解压缩运行 namesrvnohup ./bin/mqnamesrv & 启动命令详解运行 broker 测试收发消息运行自带的生产者测试类运行自带的消费者测试类 部署 Dashboard 可视化下载打包运行访问 部署服务 namesrv / broker 下载解压缩 官网下载 https://r…

Excel——项目管理,设置时间到期自动提醒及颜色高亮

效果图 第一步、自动获取合同到期日期 1、首先合同【签约日期】和【到期日期】下面的数据必须是日期格式,不能是其它的格式否则无法计算,如果是其它格式需要转换成标准的日期格式,如下图所示。 2、在“到期日期”下面的第一个单元格中输入公…

7 系列 FPGA 产品介绍及选型

目录 Spartan-7 FPGAsArtix-7 FPGAsKintex-7 FPGAsVirtex-7 FPGAsFPGA芯片命名规则DSP资源BRAM资源Transceivers 资源Transceivers 总带宽I/O 个数及带宽参考文档 Spartan-7 FPGAs Artix-7 FPGAs Kintex-7 FPGAs Virtex-7 FPGAs FPGA芯片命名规则 DSP资源 BRAM资源 Transceiver…

快速上手prometheaus grafana 监控

介绍 prometheaus 一个定时输出指标数据的巡检组件? grafana 一个读取指标,可视化的提供了好看界面的组件? 教程 如何和springboot项目集成 【IT老齐153】超级实用!十分钟掌握Prometheus与Grafana监控SpringBoot应用_哔哩哔哩_…

100000订单直接拒掉,君子爱财,取之有道

近一个月询盘可谓寥寥无几,成交率为0,今天好不容易接了一个客户询盘,订单总价高达100000,听完细节直接拒掉,至于原因懂的都懂,不懂得等我慢慢道来。 前两天有2个询盘,其中一个是二次开发&#x…

【Python爬虫实战入门】:教你一个程序实现PPT模版自由

文章目录 💥一、PPT模版爬取🔥1.1 第一个爬虫🚲1. 获取下载页面链接 ❤️1.2 第二个爬虫🚲1.3 第三个爬虫🎈2. 文件保存 ❤️1.4 翻页处理 🔥二、完整代码 🔥🔥🔥 Pytho…

大腾智能网站正式上线

4月30日,我们翘首以盼的时刻终于来临,大腾智能官网(www.da-teng.com)正式上线,我们对此感到无比兴奋和自豪!此刻,我们诚挚地邀请每一位朋友,共同踏上这个全新的数字之旅,…

从需求到实现的关键

版本封面 内容:产品logo,项目名称,所属公司,产品名称,文档类型,版本号,时间,相关人员(最好说明下负责人)。 作用: 突出重要信息,将…

【软考高项】三十八、风险管理7个过程

一、规划风险管理 1、定义、作用 定义:定义如何实施项目风险管理活动的过程作用:确保风险管理的水平、方法和可见度与项目风险程度相匹配,与对组织和其他干系人的重要程度相匹配 2、输入 项目管理计划 项目章程 项目文件 干系人登记册…