数据驱动实战二

目标

  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
treturn msg
class DriverUtil:"""浏览器驱动工具类"""_driver = None@classmethoddef 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@classmethoddef 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):@classmethoddef setUpClass(cls):cls.driver = DriverUtil.get_driver()cls.login_proxy = LoginProxy()@classmethoddef 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.rhkb.cn/news/324393.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS-背景属性

目录 背景属性 background-color (背景颜色 ) background-image (背景图片 ) background-repeat (背景图平铺方式 ) no-repeat 不平铺 repeat-x 水平方向平铺 repeat-y 垂直方向平铺 repeat 平铺 background-position (背景图位置) background-size (背景缩…

【深耕 Python】Quantum Computing 量子计算机(4)量子物理概念(一)

写在前面 往期量子计算机博客: 【深耕 Python】Quantum Computing 量子计算机(1)图像绘制基础 【深耕 Python】Quantum Computing 量子计算机(2)绘制电子运动平面波 【深耕 Python】Quantum Computing 量子计算机&…

开源RAG框架汇总

前言 本文搜集了一些开源的基于LLM的RAG(Retrieval-Augmented Generation)框架,旨在吸纳业界最新的RAG应用方法与思路。如有错误或者意见可以提出,同时也欢迎大家把自己常用而这里未列出的框架贡献出来,感谢~ RAG应用…

Redis线程模型

文章目录 💖 Redis 单线程模型⭐ 单线程监听大量的客户端连接⭐ Redis 6.0 之前为什么不用多线程? 💖 Redis多线程⭐ Redis 后台线程⭐ Redis 网络IO多线程 对于读写命令来说,Redis 一直是单线程模型。不过,在 Redis 4…

后缀树与后缀数组简介及代码模板 ← AcWing 2715

【题目来源】https://www.acwing.com/problem/content/2717/【题目描述】 给定一个长度为 n 的字符串,只包含大小写英文字母和数字。 将字符串中的 n 个字符的位置编号按顺序设为 1∼n。 并将该字符串的 n 个非空后缀用其起始字符在字符串中的位置编号表示。 现在要…

保姆级零基础微调大模型(LLaMa-Factory,多卡版)

此处非常感谢https://github.com/hiyouga/LLaMA-Factory这个项目。 看到网上的教程很多都是教如何用webui来微调的,这里出一期命令行多卡微调教程~ 1. 模型准备 模型下载比较方便的方法: 1. modelscope社区(首选,速度很高,并且很多需要申请的模型都有)注意要选择代码…

「TypeScript」TypeScript入门练手题

前言 TypeScript 越来越火&#xff0c;现在很多前端团队都使用它&#xff0c;因此咱们前端码农要想胜任以后的前端工作&#xff0c;就要更加熟悉它。 入门练手题 interface A {x: number;y: number; }type T Partial<A>;const a: T { x: 0, y: 0 }; const b: T { …

Web3 Tools - Base58

Base58编码 Base58编码是一种用于表示数字的非常见的编码方法。它通常用于加密货币领域&#xff0c;例如比特币和其他加密货币的地址表示。 什么是Base58编码&#xff1f; Base58编码是一种将数字转换为人类可读形式的编码方法。与常见的Base64编码不同&#xff0c;Base58编码…

JVM调参实践总结

JVM调优–理论篇从理论层面介绍了如何对JVM调优。这里再写一篇WIKI&#xff0c;尝试记录下JVM参数使用的最佳实践&#xff0c;注意&#xff0c;这里重点介绍HotSpot VM的调参&#xff0c;其他JVM的调参可以类比&#xff0c;但不可照搬。 Java版本选择 基于Java开发应用时&…

【问题分析】锁屏界面调起google语音助手后壁纸不可见【Android 14】

1 问题描述 为系统和锁屏分别设置两张不同的壁纸&#xff0c;然后在锁屏界面长按Power调起google语音助手后&#xff0c;有时候会出现壁纸不可见的情况&#xff0c;如以下截图所示&#xff1a; 有的时候又是正常的&#xff0c;但显示的也是系统壁纸&#xff0c;并非是锁屏壁纸…

Map按value降序并统计

package com.ldj.cloud.user.demo;import java.util.*;/*** User: ldj* Date: 2024/5/11* Time: 10:03* Description: map按value降序*/ public class Tr {public static void main(String[] args) {ArrayList<String> list new ArrayList<>();list.add("a&q…

纯血鸿蒙APP实战开发——阅读翻页方式案例

介绍 本示例展示手机阅读时左右翻页&#xff0c;上下翻页&#xff0c;覆盖翻页的功能。 效果图预览 使用说明 进入模块即是左右翻页模式。点击屏幕中间区域弹出上下菜单。点击设置按钮&#xff0c;弹出翻页方式切换按钮&#xff0c;点击可切换翻页方式。左右翻页方式可点击翻…

【前端】JavaScript的WebAPI | DOM | 获取元素 | 事件 | 操作元素 | 操作节点

文章目录 [toc] JavaScript的WebAPI一、DOM1.DOM树2.获取元素1.querySelector2.querySelectorAll 3.事件事件三要素点击事件键盘事件 4.操作元素获取/修改元素内容获取/修改元素属性获取/修改表单属性获取/修改样式属性行内样式操作类名样式操作 5.操作节点新增节点删除节点 Ja…

EasyRecovery数据恢复软件2024最新免费无需激活版下载

EasyRecovery数据恢复软件是一款功能强大、操作简便的数据恢复工具&#xff0c;旨在帮助用户解决各种数据丢失问题。无论是由于误删除、格式化、磁盘损坏还是其他原因导致的数据丢失&#xff0c;EasyRecovery都能提供有效的恢复方案。以下是对EasyRecovery软件功能的详细介绍。…

XWiki 服务没有正确部署在tomcat中,如何尝试手动重新部署?

1. 停止 Tomcat 服务 首先&#xff0c;您需要停止正在运行的 Tomcat 服务器&#xff0c;以确保在操作文件时不会发生冲突或数据损坏&#xff1a; sudo systemctl stop tomcat2. 清空 webapps 下的 xwiki 目录和 work 目录中相关的缓存 删除 webapps 下的 xwiki 目录和 work …

IP报文在设备间传递的封装过程

IP报文传递过程 1、PC1访问PC2报文传递过程1.1、PC1准备数据请求报文封装1.2、PC1准备ARP请求报文1.3、PC2准备ARP响应报文1.4、PC1完成数据请求报文封装 2、PC1访问PC3报文传递过程2.1、PC1准备数据请求报文封装2.2、PC1准备获取网关MAC地址的ARP请求报文2.3、网关准备ARP响应…

Github2024-05-10开日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-05-10统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4TypeScript项目4JavaScript项目1Lua项目1C项目1Rust项目1Dart项目1 RustDesk: 用Rust编写的开源远…

【Linux】进程间通信之共享内存

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误的话&#xff0c;还望指出&…

【Linux系统编程】第十六弹---冯诺依曼体系结构与操作系统

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、冯诺依曼体系结构 2、操作系统原理 2.1、什么是操作系统&#xff1f; 2.2、用图解释操作系统 2.3、理解操作系统 总结 …

QT的TcpServer

Server服务器端 QT版本5.6.1 界面设计 工程文件&#xff1a; 添加 network 模块 头文件引入TcpServer类和TcpSocket&#xff1a;QTcpServer和QTcpSocket #include <QTcpServer> #include <QTcpSocket>创建server对象并实例化&#xff1a; /*h文件中*/QTcpServer…