web自动化测试进阶篇05 ——— 界面交互场景测试

在这里插入图片描述

 
 

在这里插入图片描述
😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。
📡主页地址:【Austin_zhai】
🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。
💎声明:博主日常工作较为繁忙,文章会不定期更新,各类行业或职场问题欢迎大家私信,有空必回。

在这里插入图片描述

 
 

阅读目录

  • 1. 目的
  • 2. 作用
  • 3. 实操
    • 3.1 场景介绍与拆分
    • 3.2 GWT表设计
    • 3.3 代码设计
  • 4. 后话

1. 目的

在这里插入图片描述

  界面交互作为黑盒测试内容中重要的一环,在广大的测试人员群体中几乎成了入行的第一个接触内容,执行测试任务时站在客户角的度出发是每个测试人员都必须做到的基本条件,而模拟客户的日常业务操作,界面交互操作就成为了重中之重。同样的在自动化测试中,我们该如何更好的将界面交互操作融入到实际的自动化测试代码和框架中呢,今天博主就带着大家来看一看界面交互的一些进阶设计方法。

 
 

2. 作用

在这里插入图片描述

  那么在自动化测试中界面交互具体的实际意义有哪些呢?首先从业务层面来看,测试人员为了更接近真实用户的日常业务行为,必定需要设计一系列的对应界面交互操作,因为复杂交互测试会涉及多个元素之间的复杂交互和页面状态的变化,更接近真实用户在web被测对象中的实际操作,比起无计划的胡乱操作,通过特定的界面交互操作可以有效的模拟用户实际的使用场景,从而更全面地验证应用程序的功能和用户体验。那么与之相呼应的就是一旦形成有明确目的性的界面交互操作规划之后,该功能模块的测试覆盖率自然而然的就会被提升上来,我们所熟知的界面交互,除了一些组件的操作之外,动态内容、异步请求、页面跳转、弹出框交互等等也是经常会涉及到。有了这些元素的交叉与组合,测试人员就可以发现更多的潜在问题,从而提高测试的覆盖率。

  另外,除了界面的基础交互之外,数据的交换(前端与后端的逻辑处理)同样也可以借由界面交互的检查来进行验证。当然,这需要之前的有效交互操作规划来作为大前提。比如通过数据表单提交和后台数据的处理,可以验证前后端数据的传递是否正确,这样的场景相信大家应该都不会陌生,那么如何有效的排列组合各类的表单提交与数据检查就成为了是否成功执行该类测试场景的核心因素之一。

 
 

3. 实操

在这里插入图片描述
  好了,以上是对于界面交互的一些大致内容进行了一些了解,那我们接下来以一个实际的业务案例来进行界面交互在自动化测试中的应用方法。

 

3.1 场景介绍与拆分

   测试业务场景:某金融系统中,用户希望申请一笔贷款。贷款申请涉及填写个人信息、选择贷款产品、填写贷款金额、选择还款期限、上传必要资料等步骤,同时系统会根据用户信息和贷款产品进行额度计算和还款计划展示。在申请过程中,可能会遇到不同的验证和提示信息,用户需要正确填写和处理各项信息,以成功提交贷款申请。

  那接下来我们将业务场景进行最基本的业务流步骤拆解,这与我们设计测试代码的覆盖范围与执行步骤、界面交互有很重要的联系,所以拆解需要尽量的清晰与简洁。

  • 用户登录金融系统账户。
  • 导航到贷款申请页面。
  • 填写个人信息,包括姓名、身份证号、手机号等,并进行格式验证。
  • 选择贷款产品类型,例如个人消费贷款、车辆抵押贷款等。
  • 填写贷款金额,并验证金额范围。
  • 选择还款期限,例如12个月、24个月等,并验证还款期限与贷款产品的对应关系。
  • 上传必要资料,例如身份证扫描件、工资单等,验证上传的文件格式和大小。
  • 系统进行额度计算和还款计划展示,并与预期结果进行对比。
  • 处理风险提示,如还款风险、借贷条款等,确认并同意。
  • 提交贷款申请。
  • 验证贷款申请状态,确保申请成功。

对应的预期结果

  • 用户能够成功登录账户并导航到贷款申请页面。
  • 用户填写的个人信息和贷款信息符合格式和范围要求。
  • 贷款额度计算和还款计划展示与预期结果一致。
  • 用户成功提交贷款申请,并能够查看申请状态。

 

3.2 GWT表设计

   基于以上的业务场景与步骤拆解,我们已经可以明确的看到其中的对应测试范围与功能点了,那么在此基础上我们就可以将以上这些进行系统的输出,形成对应的测试故事了。

场景:用户进行普通贷款申请
 
场景描述: 作为贷款申请者,用户希望能够成功申请一笔贷款,从而展开的一系列申请业务所需步骤。
 
 
Given:
用户已经登录到自己的金融账户
用户还未进行对应的信息登记(姓名、身份证号、手机号)
用户所拥有的所有认证信息均有效且登记成功
 
When:
用户进入贷款申请页面
用户使用有效的个人信息填写表单
用户选择一种贷款产品类型
用户输入符合允许范围的贷款金额
用户选择有效还款期限
用户上传必要的文件
 
Then:
被测对象应该计算贷款金额并展示还款计划
用户查看并接受贷款条款和条件
用户提交贷款申请
用户应该看到他的贷款申请状态为成功

 

3.3 代码设计

  当我们整理出以上的这些信息之后,就可以正式的开始设计对应的测试代码了,当然这里只是简单的演示传统业务下我们该如何将界面交互测试的内容融入自动化测试框架中,其中的很多步骤(测试用例的设计,代码的单元测试,优化迭代)这里碍于篇幅就不展开细说了,有疑问的可以留言或私信博主。

  与大部分的UI自动化测试框架一样,我们可以将需要测试的业务部分拆分成三部分,base、page_objects、test_loan_application分别对应三个python脚本,base就不用多说了,一些基础驱动方法都是放在这里面的,page_objects看到名字就知道我们基于PO模式将页面的元素封装在这里面,而test_loan_application当然就是我们的测试用例啦。

  话不多说,我们先来设计base脚本:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECclass BasePage:def __init__(self, driver):self.driver = driverdef wait_for_element_to_be_visible(self, by, locator, timeout=10):wait = WebDriverWait(self.driver, timeout)return wait.until(EC.visibility_of_element_located((by, locator)))class BaseTest:@classmethoddef setUpClass(cls):cls.driver = webdriver.Chrome()cls.driver.implicitly_wait(5)cls.driver.maximize_window()@classmethoddef tearDownClass(cls):cls.driver.quit()

 

  base脚本没什么好多说的,属于是常规操作了,需要说明的就是base中加入了对应异步通信的显式等待,这个大家见仁见智,自由发挥即可。接下来是page_objects,页面上的可见对象(测试对象)包括一些常见组件(按钮、下拉框等)全部封装在其中,方便后续的测试用例中的复用。

from selenium.webdriver.common.by import By
from base import BasePageclass LoginPage(BasePage):def __init__(self, driver):super().__init__(driver)self.username_input = (By.ID, "username")self.password_input = (By.ID, "password")self.login_button = (By.ID, "login_button")def login(self, username, password):self.driver.get("https://example-bank.com/login")self.driver.find_element(*self.username_input).send_keys(username)self.driver.find_element(*self.password_input).send_keys(password)self.driver.find_element(*self.login_button).click()class LoanApplicationPage(BasePage):def __init__(self, driver):super().__init__(driver)self.product_type_dropdown = (By.ID, "product_type")self.loan_amount_input = (By.ID, "loan_amount")self.repayment_period_dropdown = (By.ID, "repayment_period")self.upload_file_input = (By.ID, "upload_file")self.submit_button = (By.ID, "submit_button")def apply_for_loan(self, product_type, loan_amount, repayment_period, file_path):self.driver.get("https://example-bank.com/loan_application")self.driver.find_element(*self.product_type_dropdown).send_keys(product_type)self.driver.find_element(*self.loan_amount_input).send_keys(loan_amount)self.driver.find_element(*self.repayment_period_dropdown).send_keys(repayment_period)self.driver.find_element(*self.upload_file_input).send_keys(file_path)self.driver.find_element(*self.submit_button).click()def click_calculate_button(self):calculate_button = self.wait_for_element_to_be_visible(By.ID, "calculate_button")calculate_button.click()def select_repayment_period(self, period):repayment_period_dropdown = self.wait_for_element_to_be_visible(By.ID, "repayment_period")select = Select(repayment_period_dropdown)select.select_by_visible_text(period)def accept_risk_warning(self):accept_button = self.wait_for_element_to_be_visible(By.ID, "accept_button")accept_button.click()def risk_assessment(self):assessment_button = self.wait_for_element_to_be_visible(By.ID, "assessment_button")assessment_button.click()

 

  在test_loan_application中,我们主要对测试额度计算、还款计划展示、贷款的申请结果进行断言,在断言之前我们针对业务流程进行对应的界面交互操作,当然真实的业务肯定远远不止如此,大家只需要理解如何封装各类组件并在用例中有计划的调用即可。

import unittest
from base import BaseTest
from page_objects import LoginPage, LoanApplicationPageclass TestLoanApplication(BaseTest):def test_loan_application(self):login_page = LoginPage(self.driver)login_page.login("testuser", "testpass")loan_application_page = LoanApplicationPage(self.driver)loan_application_page.apply_for_loan("Personal Loan", "5000", "12 months", "path/to/uploaded/file.pdf")# 添加异步通信和显式等待,等待贷款申请状态显示并验证loan_application_page.wait_for_element_to_be_visible(By.ID, "loan_application_status", timeout=20)status = self.driver.find_element(By.ID, "loan_application_status").textassert "Successful" in status, "贷款申请状态错误"# 测试额度计算和还款计划展示loan_amount = "5000"repayment_period = "12 months"expected_loan_amount = "5000"expected_repayment_plan = "Monthly Installments: 12\nAmount per Installment: 416.67"loan_application_page.fill_loan_amount_and_repayment_period(loan_amount, repayment_period)loan_application_page.click_calculate_button()loan_application_page.wait_for_element_to_be_visible(By.ID, "calculated_loan_amount", timeout=10)calculated_loan_amount = self.driver.find_element(By.ID, "calculated_loan_amount").textassert calculated_loan_amount == expected_loan_amount, "额度计算错误"repayment_plan = self.driver.find_element(By.ID, "repayment_plan").textassert repayment_plan == expected_repayment_plan, "还款计划展示错误"# 处理风险提示risk_warning = loan_application_page.get_risk_warning_text()if risk_warning:loan_application_page.accept_risk_warning()else:# 如果没有风险提示,进行投资风险评估loan_application_page.risk_assessment()# 选择还款期限new_repayment_period = "24 months"loan_application_page.select_repayment_period(new_repayment_period)# 提交贷款申请loan_application_page.submit_loan_application()loan_application_page.wait_for_element_to_be_visible(By.ID, "loan_application_status", timeout=20)status = self.driver.find_element(By.ID, "loan_application_status").textassert "Successful" in status, "贷款申请状态错误"if __name__ == "__main__":unittest.main()

 
 

4. 后话

  看完以上的这个实操例子之后不知道对大家是否有所启发,其实不是说一定要用以上的方法来进行测试任务的拆解,在这里只想告诉大家,在自动化UI测试中,面对界面交互场景的测试时,我们需要有计划的对界面交互操作进行设计与实施,至于方法,这里只是给出了其中的一种思路而已,相信大家在日后的工作中一定会整理总结出适用与自己与团队的一套设计与执行的方法。

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

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

相关文章

【Ajax】笔记-同源策略

同源策略(Same-Origin Policy),是浏览器的一种安全策略 同源(即url相同):协议、域名、端口号 必须完全相同。(请求是来自同一个服务) 跨域:违背了同源策略,即跨域。 ajax请求是遵循…

texshop mac中文版-TeXShop for Mac(Latex编辑预览工具)

texshop for mac是一款可以在苹果电脑MAC OS平台上使用的非常不错的Mac应用软件,texshop for mac是一个非常有用的工具,广泛使用在数学,计算机科学,物理学,经济学等领域的合作,这些程序的标准tetex分布特产…

flask中的session介绍

flask中的session介绍 在Flask中,session是一个用于存储特定用户会话数据的字典对象。它在不同请求之间保存数据。它通过在客户端设置一个签名的cookie,将所有的会话数据存储在客户端。以下是如何在Flask应用中使用session的基本步骤: 首先…

github Recv failure: Connection reset by peer

Recv failure: Connection reset by peer 背景处理ping一下github网页访问一下github项目git配置git ssh配置再次尝试拉取 疑惑点待研究参考 背景 晚上敲着代码准备提交,执行git pull,报错Recv failure: Connection reset by peer。看着这报错我陷入了沉…

【fly-iot飞凡物联】(12):EMQX 5.1使用docker 本地部署,接入到Actorcloud的数据库中,成功连接创建的设备,可以控制设备访问状态

目录 前言1,关于2,使用docker 进行部署3,配置API key 可以使用接口访问的4,设置客户端认证,连接PostgreSQL 数据连接5,使用客户端进行连接6,EMQX的API 接口地址7,总结 前言 本文的原…

应用层协议——http

文章目录 1. HTTP协议1.1 认识URL1.2 urlencode和urldecode1.3 HTTP协议格式1.3.1 HTTP请求1.3.2 HTTP响应1.3.3 外网测试1.3.4 添加html文件1.3.5 HTTP常见Header1.3.6 GET和POST 1.4 HTTP的状态码1.4.1 301和3021.4.2 代码实现 1.5 Cookie1.5.1 代码验证1.5.2 Cookiesession …

JetBrains 为测试自动化打造的强大 IDE-Aqua

QA 和测试工程对现代软件开发必不可少。 在 JetBrains,我们相信使用正确的工具对每项工作都很重要。 对我们来说,为自动化测试开发创建单独的工具是自然而然的事,因为这使我们能够满足多角色软件开发团队的需求。 我们很高兴能够推出 JetBra…

Transformer背景介绍

目录 Transformer的诞生Transformer的优势Transformer的市场 Transformer的诞生 论文地址 Transformer的优势 Transformer的市场

MHA高可用配置及故障切换

文章目录 MHA高可用配置及故障切换一. MySQL MHA1.什么是MHA2.MHA的组成2.1MHA Node (数据节点)2.2MHA Manager (管理节点) 3.MHA的特…

【观察】以超融合创新架构,加速企业应用现代化

我们知道,数字化转型的不断加速,核心就是应用的加速。在整个数字化体系中,软件应用是让一切发挥价值的落地路径。在应用发挥能力之前,企业需要进行大量软硬件准备以及应用开发工作;在应用开始发挥能力之,企…

认识什么是架构

目录 ​编辑 一、架构是什么 1.1 系统与子系统 1.1.1 系统 1.1.1.1 关联 1.1.1.2 规则 1.1.1.3 能力 1.1.2 子系统 1.2 模块与组件 1.2.1 模块 1.2.2 组件 1.3 框架与架构 1.3.1 框架 1.3.2 架构 1.3.2.1 架构定义 1.3.2.2 架构组成 1.3.2.2.1 要素 1.3.2.2.2 结构 1.3.2…

从零开始理解Linux中断架构(23)中断运行临界区和占先调度

Linux在内核中定义了6种运行临界区。 in_interrupt in_interrupt在驱动中使用频率最高的函数了,in_interrupt()就是指示Core是否正在中断处理中,包含了硬中断,软中断运行临界区。如果在中断处理中,则不能调用__do_softirq执行软中断处理。硬中断中不可调度不可中断,所有…

Linux vsftp三种模式的简单配置部署

环境:Debian 6.1.27-1kali1 (2023-05-12) vsftpd 安装 --查看是否当前系统是否已安装 apt list --installed | grep vsftpd 没有安装的话,就正常安装 apt-get update apt-get install vsftpd 一、匿名用户模式 分享一些不重要文件,任…

Android 通用带箭头提示窗

简介 自定义PopupWindow, 适用于提示类弹窗。 使用自定义Drawable设置带箭头的背景,测试控件和弹窗的尺寸,自动设置弹窗的显示位置,让箭头指向锚点控件的中间位置,且根据锚点控件在屏幕的位置,自动适配弹窗显示位置。…

C++——STL容器之list链表的讲解

目录 一.list的介绍 二.list类成员函数的讲解 2.2迭代器 三.添加删除数据: 3.1添加: 3.2删除数据 四.排序及去重函数: 错误案例如下: 方法如下: 一.list的介绍 list列表是序列容器,允许在序列内的任何…

css实现鼠标滑动左下角弹框带动画效果

代码 <div classNamekuang></div> css代码 .kuang {height: 500px;width: 400px;// background-color: #fff;position: absolute;z-index: 10;bottom: 0;transform: translateX(-390px)}.kuang:hover {animation: myanimation 3s linear 1;animation-fill-mode:f…

Flowable-中间事件-空中间抛出事件

定义 空中间抛出事件是一个 Throwing 事件&#xff0c;在 intermediateThrowEvent 元素下不加入任何的事件定 义元素&#xff0c;就构成一个空中间抛出事件。它通常用于表示流程中的某个状态&#xff0c;在实际使用的过程中可 以通过添加执行监听器&#xff0c;来表示流程状态…

算法通关村第二关——两两交换链表中的节点的问题解析

题目类型 链表反转 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点&#xff0c;且必须在不修改节点内部的值的情况下完成本题&#xff0c;即&#xff1a;只能进行节点交换 效果图 题目分析 如果原始顺序是 dummy(虚拟头节点) …

Linux学习之系统函数库

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64&#xff0c;bash --version可以bash的版本是4.2.46。 在/etc/init.d/functions有许多系统定义好的函数&#xff0c;比如…

基于ChatGPT聊天的零样本信息提取7.25

基于ChatGPT聊天的零样本信息提取 摘要介绍ChatIE用于零样本IE的多轮 QA 实验总结 摘要 零样本信息提取&#xff08;IE&#xff09;旨在从未注释的文本中构建IE系统。由于很少涉及人类干预&#xff0c;因此具有挑战性。 零样本IE减少了数据标记所需的时间和工作量。最近对大型…