写点什么

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

  • 2023-02-17
    北京
  • 本文字数:3128 字

    阅读完需:约 10 分钟

1.断言简介

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

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

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

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

  • 比较大小:比较数字的大小( 如 2>1 )。

  • 内容包含:某个字符串包含另一个字符串(“abcd”包含“ab”)。

  • 内容不包含:某个字符串不包含另一个字符串(如“abc”不包含"de")。

  • 验证布尔值:验证一个表达式是否为真(如 2>=1)。


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

Python 版本

# 第一种:比较大小price = driver.find_element(   By.XPATH,'//*[contains(@resource-id="current_price")]').textassert float(price) >=170
#第二种:包含验证name = driver.find_element( By.XPATH,'//*[contains(@resourse-id="stockName")]').textassert"BABA" in name
#第三种:布尔值验证def check(): name = driver.find_elements(By.XPATH,'//*[contains(@resource-id="stockName")]') return True if len(name)!=0 else Falseassert check()
复制代码


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


Java 版

//第一种:比较大小String price = driver.findElement(By.xpath("//*[contains(@resource-id=\"current_price")]")).getText();float currentprice = Float.parseFloat(price);float expectprice = 170;assert currentprice >=expectprice;
//第二种:包含验证Srting name = driver.findElement(By.xpath("//*[contains(@resource-id=\"stockNme")]")).getText();
assert name.contains("BABA");
//第三种:布尔值验证@Testpublic boolean check(){ List<WebElement> name = driver.findElements(By.xpath("// *[contains(@resource-id=\"stockName\")]")); return name.size() > 0 ? turn : false;}
@Testpublic void checkTest(){ assert check();}
复制代码


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

3.Hamcrest 断言

(1)Hamcrest 简介

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

(2)安装 Hamcrest

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

Python 版本

pip install pyhamcrest
复制代码


Java 版本

<dependency>      <groupId>org.hamcrest</groupId>      <artifactId>hamcrest</artifactId>      <version>2.2</version>      <scope>test</scope></dependency>
复制代码


(3)导入 Hamcrest 包

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

Python 版本

from hamcrest import * 
复制代码


Java 版本

import static org.hamcrest.MatcherAssert.assertThat;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 演示代码

from hamcrest import assert_that,close_to...def test_wait(self):    #点击"搜索输入框"    self.driver.find_element_by_id(       "com.xueqiu.android:id/tv_search").click()    #输入"alibaba"    self.driver.find_element_by_id(         "com.xueqiu.android:id/search_input_text"         ).send_keys("alibaba")     #点击"阿里巴巴"     self.driver.find_element_by_xpath("//*[text='阿里巴巴']").click()     #点击"股票"     self.driver.find_element_by_xpath(       "//*[contains(@resourse-id,'title_container')]//*[@text='股票']"       ).click()     #获取股票价格     locator = (MobileBy.XPATH,     "//*[@text='09988']/../../..\     //*[@resource-id='com.xueqiu.android:id/current_price']")     ele = WebDriverWait(self.driver,10)\     .until(expected_conditions.element_to_be_clickable(locator))          print(ele.text)     current_price = float(ele.text)     expect_price = 170          # 使用Hamcrest断言来判断股票价格浮动在10%范围内     assert_that current_price,     close_to(expect_price,expect_price * 0.1))...
复制代码


Java 演示代码

import static org.hamcrest.MatcherAssert.assertThat;import static org.hamcrest.Matchers.*;...@Testpublic void waitlTest(){    //点击"搜索输入框"    driver.findElementById("com.xueqiu.android:id/tv_search").click();    //输入"alibaba"    driver.findElementById("com.xueqiu.android:id/search_input_text").sendKeys("alibaba");
//点击"阿里巴巴" driver.findElementByXPath("//*[@text=\"阿里巴巴\"]").click(); //点击"股票" driver.findElementByXPath("//*[contains(@resource-id,\"title_container\")]// *[text=\"股票\"]").click(); //获取股票价格 By price_locator = By.xpath("//*[@text='09988']/../../..//*[@resource-id=\"com.xueqiu.android:id/current_price\"]"); WebDriverWait wait = new WebDriverWait(driver,10); WebElement ele = wait.until(ExpectedConditions.elementToBeClickable(price_locator));
System.out.println(ele.getText()); double currentPrice = Double.parseDouble(ele.getText()); double expectPrice = 170; //使用Hamcrest 断言来判断股票价格浮动在10%范围内 assertThat(currentPrice,closeTo(expectPrice,expectPrice*0.1)); }...
复制代码


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


搜索微信公众号:TestingStudio 霍格沃兹的干货都很硬核

用户头像

社区:ceshiren.com 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
软件测试 | 属性获取与断言_测试_测吧(北京)科技有限公司_InfoQ写作社区