软件测试 |属性获取与断言

1.断言简介

断言时候UI自动化测试的三要素之一,是UI自动化测试中不可或缺的部分。我们使用定位器到定位元素后,通过测试脚本进行业务交互操作时,想要验证交互操作过程中的结果正确性就需要用到断言。

2.常规的UI自动化测试中使用的断言

在UI自动化测试中,我们通过使用断言来分析测试结果的正确性。

常用的断言一般包含以下几种。

  • 比较大小:比较数字的大小( 如2>1 )。
  • 内容包含:某个字符串包含另一个字符串(“abcd”包含“ab”)。
  • 内容不包含:某个字符串不包含另一个字符串(如“abc”不包含"de")。
  • 验证布尔值:验证一个表达式是否为真(如2>=1)。

演示代码如下(Python版本和Java版本):

Python版本

  1. # 第一种:比较大小

  2. price = driver.find_element(

  3. By.XPATH,'//*[contains(@resource-id="current_price")]').text

  4. assert float(price) >=170

  5. #第二种:包含验证

  6. name = driver.find_element(

  7. By.XPATH,'//*[contains(@resourse-id="stockName")]').text

  8. assert"BABA" in name

  9. #第三种:布尔值验证

  10. def check():

  11. name = driver.find_elements(By.XPATH,'//*[contains(@resource-

  12. id="stockName")]')

  13. return True if len(name)!=0 else False

  14. assert check()

从上面的示例可以看出,Python用assert来判断一个条件是否为真,如果条件为真,就继续执行;如果条件为假,则抛出AssertError异常包含错误信息。断言可以在条件不满足程序运行的情况下直接返回错误异常信息。

Java版本

  1. //第一种:比较大小

  2. String price = driver.findElement(By.xpath("//*[contains(@resource-

  3. id=\"current_price")]")).getText();

  4. float currentprice = Float.parseFloat(price);

  5. float expectprice = 170;

  6. assert currentprice >=expectprice;

  7. //第二种:包含验证

  8. Srting name = driver.findElement(By.xpath("//*[contains(@resource-

  9. id=\"stockNme")]")).getText();

  10. assert name.contains("BABA");

  11. //第三种:布尔值验证

  12. @Test

  13. public boolean check(){

  14. List<WebElement> name = driver.findElements(By.xpath("//

  15. *[contains(@resource-id=\"stockName\")]"));

  16. return name.size() > 0 ? turn : false;

  17. }

  18. @Test

  19. public void checkTest(){

  20. assert check();

  21. }

从上面的示例可以看出,Java用assert关键字进行断言。另外,如果需要处理更复杂的断言,可以使用Hamcrest提供的方法。Hamcrest提供了大量被称为 “匹配器”的方法。

3.Hamcrest断言

(1)Hamcrest简介

Hamcrest是一个以测试应用为目的、能灵活组合表达式的匹配器类库,也用于编写断言的框架,使用这个框架编写断言,可以提高程序的可读性及测试的效率。Hamcrest提供了大量被称为 “ 匹配器” 的方法。每个匹配器都可用于执行特定的比较操作。Hamcrest的可扩展性强,允许创建自定义的匹配器,并支持多种语言。

(2)安装Hamcrest

在Python和Java环境下安装Hamcrest演示如下。

Python版本

pip install pyhamcrest

Java版本

  1. <dependency>

  2. <groupId>org.hamcrest</groupId>

  3. <artifactId>hamcrest</artifactId>

  4. <version>2.2</version>

  5. <scope>test</scope>

  6. </dependency>

(3)导入Hamcrest包

代码中使用Hamcrest时,需要先在代码中导入Hamcrest包。Hamcrest的Python和Java环境下的包导入如下。

Python版本

from hamcrest import * 

Java版本

  1. import static org.hamcrest.MatcherAssert.assertThat;

  2. import static org.hamcrest.Matchers.*;

Hamcrest提供了一个全新的断言语法(assert_that),可以只使用assert_that实现一个断言语句,然后结合Hamcrest提供的匹配符,就可以完成各种场景下的断言任务。

(4)assert-that提供的API(方法)

1)比较两个字符串相等的API实例代码如下(Python版和Java版)。

Python版

assert_that("this is a string",equal_to("this is a string"))

Java版本

assertThat("this is a string",equalTo("this is a string"));

2)数值匹配,比较两个值是否接近的API示例代码如下(Python版和Java版)。

Python版

assert_that(8,close_to(10,2))

Java版本

assertThat(8.0,closeTo(10,2));

解释:断言8接近于(8~12)这个范围。

3)判断包含某个字符的API实例代码如下(Python版和Java版)。

Python版本

assert_that('abc',contains_string('d'))

Java版本

assertThat("abc",conrainsString("d"));

(5)案例

测试案例使用的是“雪球”应用,打开雪球App,先点击App页面上的“搜索输入框”,并在 “搜索输入框”中输入“alibaba”,然后再搜索关键字联想出来的词组列表里面点击“阿里巴巴”,选择股票分类,获取股票类型为“09988”的股票价格,最后验证价格在预期价格的10%上下浮动。核心演代码如下(Python版和Java版)。

Python演示代码

  1. from hamcrest import assert_that,close_to

  2. ...

  3. def test_wait(self):

  4. #点击"搜索输入框"

  5. self.driver.find_element_by_id(

  6. "com.xueqiu.android:id/tv_search").click()

  7. #输入"alibaba"

  8. self.driver.find_element_by_id(

  9. "com.xueqiu.android:id/search_input_text"

  10. ).send_keys("alibaba")

  11. #点击"阿里巴巴"

  12. self.driver.find_element_by_xpath("//*[text='阿里巴巴']").click()

  13. #点击"股票"

  14. self.driver.find_element_by_xpath(

  15. "//*[contains(@resourse-id,'title_container')]//*[@text='股票']"

  16. ).click()

  17. #获取股票价格

  18. locator = (MobileBy.XPATH,

  19. "//*[@text='09988']/../../..\

  20. //*[@resource-id='com.xueqiu.android:id/current_price']")

  21. ele = WebDriverWait(self.driver,10)\

  22. .until(expected_conditions.element_to_be_clickable(locator))

  23. print(ele.text)

  24. current_price = float(ele.text)

  25. expect_price = 170

  26. # 使用Hamcrest断言来判断股票价格浮动在10%范围内

  27. assert_that current_price,

  28. close_to(expect_price,expect_price * 0.1))

  29. ...

Java演示代码

  1. import static org.hamcrest.MatcherAssert.assertThat;

  2. import static org.hamcrest.Matchers.*;

  3. ...

  4. @Test

  5. public void waitlTest(){

  6. //点击"搜索输入框"

  7. driver.findElementById("com.xueqiu.android:id/tv_search").click();

  8. //输入"alibaba"

  9. driver.findElementById("com.xueqiu.android:id/

  10. search_input_text").sendKeys("alibaba");

  11. //点击"阿里巴巴"

  12. driver.findElementByXPath("//*[@text=\"阿里巴巴\"]").click();

  13. //点击"股票"

  14. driver.findElementByXPath("//*[contains(@resource-id,\"title_container\")]//

  15. *[text=\"股票\"]").click();

  16. //获取股票价格

  17. By price_locator = By.xpath("//*[@text='09988']/../../..//*[@resource-

  18. id=\"com.xueqiu.android:id/current_price\"]");

  19. WebDriverWait wait = new WebDriverWait(driver,10);

  20. WebElement ele =

  21. wait.until(ExpectedConditions.elementToBeClickable(price_locator));

  22. System.out.println(ele.getText());

  23. double currentPrice = Double.parseDouble(ele.getText());

  24. double expectPrice = 170;

  25. //使用Hamcrest 断言来判断股票价格浮动在10%范围内

  26. assertThat(currentPrice,closeTo(expectPrice,expectPrice*0.1));

  27. }

  28. ...

上面的实例中,assert_that/assertThat是用于生成测试断言的样式化语句,用于比较两个值(current_price与expect_price)是否接近,断定实际值current_price在expect_price-expect_price* 0.1与expect_price+expect_price* 0.1区间浮动。

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

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

相关文章

vue3基础ref,reactive,toRef ,toRefs 使用和理解

文章目录 一. ref基本用法在模板中使用ref 与 reactive 的区别使用场景 二. reactive基本用法在模板中使用reactive 与 ref 的区别使用场景性能优化 三. toRef基本用法示例在组件中的应用主要用途对比 ref 和 toRef 四. toRefs基本用法示例在组件中的应用主要用途对比 ref 和 t…

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(一)---UnrealCV获取深度+分割图像

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车&#xff0c;并使用通过跨平台的方式进行ROS2和UE5仿真的通讯&#xff0c;达到小车自主导航的目的。本教程使用的环境&#xff1a; ubuntu 22.04 ros2 humblewindows11 UE5.4.3python8 本系列教程将涉及以…

二叉树中的奇偶树问题

目录 一题目&#xff1a; 二思路汇总&#xff1a; 1.二叉树层序遍历&#xff1a; 1.1题目介绍&#xff1a; 1.2 解答代码&#xff08;c版&#xff09;&#xff1a; 1.3 解答代码&#xff08;c版&#xff09;&#xff1a; 1.4 小结一下&#xff1a; 2.奇偶树分析&#xf…

推荐一个开源的kafka可视化客户端GUI工具(Kafka King)

大佬的博客地址&#xff1a; https://blog.ysboke.cn/posts/tools/kafka-king Github地址&#xff1a; https://github.com/Bronya0/Kafka-King Kafka-King功能清单 查看集群节点列表&#xff08;完成&#xff09;支持PLAINTEXT、SASL PLAINTEXT用户名密码认证&#xff08;完…

Python 如何创建和解析 XML 文件

XML&#xff08;可扩展标记语言&#xff09;是一种广泛使用的标记语言&#xff0c;主要用于存储和传输数据。它具有结构化、层次化的特点&#xff0c;常被用作数据交换格式。Python 提供了多种工具和库来处理 XML 文件&#xff0c;包括创建、解析和操作 XML 文档。 一、XML 简…

qt-13 进度条(模态和非模态)

进度条-模态和非模态 progressdlg.hprogressdlg.cppmain.cpp运行图模态非模态 progressdlg.h #ifndef PROGRESSDLG_H #define PROGRESSDLG_H#include <QDialog> #include <QLabel> #include <QLineEdit> #include <QProgressBar> #include <QCombo…

人物形象设计:塑造独特角色的指南

引言 人物形象设计是一种创意过程&#xff0c;它利用强大的设计工具&#xff0c;通过视觉和叙述元素塑造角色的外在特征和内在性格。这种设计不仅赋予角色以生命&#xff0c;还帮助观众或读者在心理层面上与角色建立联系。人物形象设计的重要性在于它能够增强故事的吸引力和说…

p8 Run的流程和Docker原理

docker run的运行原理图 docker是怎么工作的&#xff1f; docker是一个cs的一个结构的系统docker的守护进程运行在宿主机上面通过socket进行访问 其实就是看下面的这个图&#xff0c;通过客户端的命令来操作docker的守护进程然后启动一些容器&#xff0c;默认容器是不启动的 …

网络基础概念【网络】

文章目录 网络协议协议分层 OSI七层模型TCP/IP五层&#xff08;或四层&#xff09;模型同局域网的两台主机通信数据包封装和解包分用&#xff08;数据段&#xff0c;数据报&#xff0c;数据帧&#xff09;网络中的地址管理 网络协议 协议分层 网络协议栈设计成层状结构&#…

【学习笔记】Day 20

一、进度概述 1、机器学习常识12-18&#xff0c;以及相关代码复现 二、详情 12、SVM&#xff08;support vector machines&#xff0c;支持向量机&#xff09; 实际上&#xff0c;支持向量机是一种二分类模型&#xff0c;它将实例的特征向量映射为空间中的一些点&#xff0c;…

如何将CSDN文章导出为pdf文件

第一步&#xff1a; 打开想要导出的页面&#xff0c;空白处点击鼠标右键⇒点击“检查”或“check”&#xff0c;或直接在页面按F12键。 第二步&#xff1a; 复制以下代码粘贴到控制台&#xff0c;并按回车。 若提示让输入“允许粘贴”或“allow pasting”&#xff0c;按提示…

Redis 用于高效的队列管理和临时缓存,支持每分钟处理数千笔订单的高并发场景

为了支持高并发订单处理&#xff0c;并结合 MySQL 进行持久化&#xff0c;可以将 Redis 用于高效的队列管理和临时缓存&#xff0c;而 MySQL 用于最终数据存储。下面是一个结合 Redis 和 MySQL 的完整示例。 MySQL 表结构 首先&#xff0c;需要定义 MySQL 表结构来存储订单和…

python——concurrent.futures

concurrent.futures 是 Python 标准库中用于并行编程的高级模块&#xff0c;它提供了一种高级别的接口来管理线程和进程。通过这个模块&#xff0c;你可以轻松地利用多线程和多进程来并行执行任务&#xff0c;进而提高程序的执行效率。 1. concurrent.futures 概述 concurren…

百度地图路书实现历史轨迹回放、轨迹回放进度、聚合点、自定义弹框和实时监控视频、多路视频轮巡播放

前言 分享一个刚做完项目集成技术&#xff0c;一个车辆行驶轨迹监控、行车视频监控、对特种车辆安全监管平台&#xff0c;今年政府单位有很多监管平台项目&#xff0c;例如&#xff1a;渣土车监控、租出车监管、危害气体运输车监管等平台&#xff0c;这些平台都有车辆行驶轨迹…

2024年电赛H题全开源

当题目出来的的那一刻&#xff0c;看到了M0芯片&#xff0c;我们实验室只有一块板子&#xff0c;并且我没有接触过M0&#xff0c;电赛只准备了TI的MSP430f5529。但是我并没有放弃&#xff0c;决然的选择了H题。基本上将四问全做出来&#xff0c;可是测试由于使用了感为科技的寻…

OGR-矢量筛选

OGR-矢量筛选 1.属性筛选 # 根据字段属性进行过滤 ds ogr.Open(os.path.join(data_dir, global)) lyr ds.GetLayer(ne_50m_admin_0_countries) >1 lyr.SetAttributeFilter(continent "Asia") lyr.GetFeatureCount() >2:二次筛选 # You can still get a fe…

Go 语言类型转换 19

Go 语言支持类型转换&#xff0c;用于将一个值从一种类型转换到另一种类型。类型转换可以是隐式的&#xff0c;也可以是显式的。 隐式类型转换 Go 语言支持隐式类型转换&#xff0c;例如&#xff1a; i : 42 f : float64(i)上面的代码隐式地将整数 i 转换为浮点数 f。 显式…

Linux基础知识学习(五)

1. 用户组管理 每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理&#xff08;开发、测试、运维、root&#xff09;。不同Linux 系统对用户组的规定有所不同&#xff0c;如Linux下的用户属于与它同名的用户组&#xff0c;这个用户组在创建用户…

Java 前端与后端交互:解锁 RESTful API 设计的秘密

引言 随着互联网技术的快速发展&#xff0c;前后端分离已经成为现代 Web 开发的主流趋势之一。在这个过程中&#xff0c;RESTful API 成为了连接前端界面与后端数据处理的重要桥梁。作为一位拥有20年实战经验的编码专家&#xff0c;我见证了 RESTful API 在不同场景中的广泛应…

QT聊天室基于Tcp

server.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this)) // 给服务器指针对象实例化空间{ui->setupUi(this); }Widget::~Widget() {delete ui; }…