IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> PO模式项目实战思路分析 -> 正文阅读

[开发测试]PO模式项目实战思路分析

PO模式学习思路

采用版本迭代的方式来学习, 便于对不同版本的优缺点进行对比和理解
????????V1: 不使用任何设计模式和单元测试框架(线性模型)
????????V2: 采用测试框架,使用UnitTest管理用例
????????V3: 业务代码和页面对象进行分离,使用方法封装的思想, 对代码进行优化
????????V4: 实际中的PO模式编写,PO模式深入封装, 把共同操作提取封装到父类中,
? ? ? ? ? ? ? ? ?子类直接调用父类的方法

选择的测试用例

对项目的登录模块进行自动化测试

账号不存在
1. 点击首页的‘登录’链接, 进入登录页面
2. 输入一个不存在的用户名
3. 输入密码
4. 输入验证码
5. 点击登录按钮
6. 获取错误提示信息

密码错误
1. 点击首页的‘登录’链接, 进入登录页面
2. 输入用户名
3. 输入一个错误的密码
4. 输入验证码
5. 点击登录按钮
6. 获取错误提示信息

V1版本

不使用任何设计模式和单元测试框架。
每个文件里编写一个用例, 完全的面向过程的编程方式。

存在的问题

  • 一条测试用例对应一个文件, 用例较多时不方便管理维护
  • 代码高度冗余

?V2版本

使用UnitTest管理用例, 并断言用例的执行结果

引入UnitTest的好处

  • 方便组织、 管理多个测试用例
  • 提供了丰富的断言方法
  • 方便生成测试报告
  • 减少了代码冗余

存在的问题

  • 代码冗余
  • 页面操作和元素操作都在同一个文件,维护成本高

V3版本

使用方法封装的思想, 对代码进行优化。

  • 定义获取驱动对象的工具类
  • 封装“获取弹出框的提示消息”

方法封装

方法封装: 是将一些有共性的或多次被使用的代码提取到一个方法中, 供其他地方调用。

封装的好处:

  • 避免代码冗余
  • 容易维护
  • 隐藏代码实现的细节

目的: 用最少的代码实现最多的功能

PO介绍

存在的问题

在做UI自动化时定位元素特别依赖页面, 一旦页面发生变更就不得不跟着去修改定位元素的代码。

举例: 假设要对一个元素进行点击操作, 而且会经常对该元素进行操作, 那么你就可能会编写多处如下代码
????????driver.find_element_by_id("login-btn").click()

存在的问题:

  • 如果开发人员修改了这个元素的id, 这时候你就不得不修改所有对应的代码
  • 存在大量冗余代码

PO模式

PO是Page Object的缩写, PO模式是自动化测试项目开发实践的最佳设计模式之一

核心思想是通过对界面元素的封装减少冗余代码, 同时在后期维护中, 若元素定位发生变化, 只需要调整页面元素封装的代码, 提高测试用例的可维护性、 可读性。

PO模式可以把一个页面分为三层, 对象库层、 操作层、 业务层。

  • 对象库层: 封装定位元素的方法
  • 操作层: 封装对元素的操作
  • 业务层: 将一个或多个操作组合起来完成一个业务功能。 比如登录: 需要输入帐号、 密码、 点击登录三个操作

引入PO模式的好处

引入PO模式前

  • 存在大量冗余代码
  • 业务流程不清晰
  • 后期维护成本大

引入PO模式后

  • 减少冗余代码
  • 业务代码和测试代码被分开, 降低耦合性
  • 维护成本低

V4版本

采用PO模式的分层思想对代码进行拆分

1、base(基类):page页面一些公共的方法

  • 初始化方法
  • 查找元素方法
  • 点击元素方法
  • 输入方法
  • 获取文本方法
  • 截图方法?

注:

  • 以上方法封装的时候,解包只需一次,在查找元素解包
  • driver为虚拟,谁调用base时,谁传入,无需关注从哪里来?

2、page(页面对象):一个页面封装成一个对象--继承base

  • page包下面的__init__.py存放基本的配置数据,
  • page_login.py直接导包即可以通过page.来使用
  • 或者导包之后通过继承的的方法在类里面直接通过self.调用

3、scrips(业务层):导包调用page页面?

初始化方法? ? setUp()? 注:在unittest框架中不能使用def __init__()初始化方法;

  • 实例化页面对象
  • 前置操作? 如:打开等等

结束方法? ? teardown()

  • 关闭驱动

测试方法

  • 根据要操作的业务来实现?

拓展:元组解包

loc变量为元组,*loc为解包

from selenium.webdriver.common.by import By
driver = None
# loc = (By.CSS_SELECTOR, ".telA")
loc = By.CSS_SELECTOR, ".telA"
# driver.find_element(By.CSS_SELECTOR, ".telA")
print(type(loc))
print("未解包之前:", loc)
print("解包之后:", *loc)

运行结果:解包之后,单引号被去掉了?

??

# 查找元素方法
    def base_find_element(self, loc, timeout=30, poll=0.5):
        # 使用显示等待
        """
        :param loc: 元素的配置信息,格式为元组 如:login_link = By.PartialLink, "登录"
        :param timeout: 默认超时时间为30,可以通过传入参数进行修改
        :param poll: 默认访问频率 0.5秒
        :return: 查找到的元素
        """
        return WebDriverWait(self.driver,
                             timeout=timeout,
                             poll_frequency=poll).until(lambda x: x.find_element(*loc))
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:47:37  更:2021-10-23 12:48:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 2:44:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码