首页 > 其他分享 >技术分享 | app自动化测试(Android)-- 属性获取与断言

技术分享 | app自动化测试(Android)-- 属性获取与断言

时间:2022-08-17 11:13:07浏览次数:90  
标签:断言 -- text app driver id assert Android price

原文链接
本文节选自霍格沃兹测试开发学社内部教材

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

常规的UI自动化断言

分析正确的输出结果,常规的断言一般包含以下的几个情形:

  • 比较大小

  • 包含或者不包含

  • 验证布尔值

Python 示例代码

# 第一种 :比较大小
price = driver.find_element(
    By.XPATH,'//*[contains(@resource-id="current_price")]').text
assert float(price) >=170

# 第二种 :包含验证
name = driver.find_element(
    By.XPATH,'//*[contains(@resource-id="stockName")]').text
assert "BABA" in name

# 第三种 :布尔值验证
def check():
    name = driver.find_elements(By.XPATH,'//*[contains(@resource-id="stockName")]')
    return True if len(name)!=0 else False
assert 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;

// 第二种 :包含验证
String name = driver.findElement(By.xpath("//*[contains(@resource-id=\"stockName\")]")).getText();

assert name.contains("BABA");

// 第三种 :布尔值验证
@Test
public boolean check(){
    List<WebElement> names = driver.findElements(By.xpath("//*[contains(@resource-id=\"stockName\")]"));
    return names.size() > 0 ? true : false;
}

@Test
public void checkTest(){
    assert check();
}

上面的示例可以看出,测试中经常会需要使用断言来判断一个条件是否为真,Java 语法中也可以通过 assert 关键字进行断言。另外如果需要更复杂的断言处理,可以使用 Hamcrest 提供的方法,Hamcrest 提供了大量被称为“匹配器”的方法。

Hamcrest断言

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

Hamcrest 安装

  • Python 版本
pip install pyhamcrest

  • Java 版本
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest</artifactId>
    <version>2.2</version>
    <scope>test</scope>
</dependency>

Hamcrest 导包

  • Python 版本
from hamcrest import *

  • Java 版
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

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

常用方法 API

1.比较两个字符串相等,示例代码如下:

  • 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.数值匹配,比较两个值是否接近,示例代码如下:

  • Python 版本
assert_that(8,close_to(10,2))

  • Java 版本
assertThat(8.0,closeTo(10,2));

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

3.包含某个字符,示例代码如下:

  • Python 版本
assert_that('abc',contains_string('d'))

  • Java 版本
assertThat("abc",containsString("d"));

案例

使用“雪球”应用,打开雪球 APP,点击页面上的搜索输入框输入“alibaba”,然后在搜索联想出来的列表里面点击“阿里巴巴”,选择股票分类,获取股票类型为“09988”的股票价格,最后验证价格在预期价格的 10% 范围浮动。核心代码如下:

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(@resource-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.*;
...
@Test
public void wait1Test(){
    // 点击搜索输入框
    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_price0.1 与 expect_price+expect_price0.1 范围区间浮动。

获取更多相关资料,请添加微信ceshiren001

标签:断言,--,text,app,driver,id,assert,Android,price
From: https://www.cnblogs.com/chengzi-ceba/p/16594340.html

相关文章

  • 继承
    1.继承面向对象开发有三大特性(特点/特征):封装,继承,多态。将一堆类中的一些共有的“成员”单独抽取出来,作为一个父类,然后这一堆类继承这个父类,共享父类的资源,这就叫做继承......
  • B/S大附件上传,支持断点续传
    ​ 1 背景用户本地有一份txt或者csv文件,无论是从业务数据库导出、还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工、挖掘和共创应用的时候,首先要将本地文......
  • 了解位运算
    1.与(&)运算符使用规则:两个二进制操作数对应位同为1结果位才为1,其余情况为0;3=>00000000000000115=>0000000000000101&   000000000000......
  • 《GB28261-2012》PDF下载
    《GB28261-2012安全气囊气体发生器用点火具生产安全技术条件》PDF下载《GB28261-2012》简介本标准规定了安全气囊气体发生器用点火具生产、贮存、运输和销毁的安全技术......
  • css 伪类实现渐变线条
    如下图所示:  需要实现渐变的小竖线或者小横线可以用伪类,代码如下:div{position:relative;z-index:2;&::after{conte......
  • MFC实现Txt03之CRichEditView实现文本拖拽功能
    02实现了基本的Txt操作功能,现在还想加一个拖拽功能,即把一个Txt文本拖拽进来,然后自动打开该文本。(参考Txt拖拽,不理解的话就试一下,就是把另一个Txt拖到一个已打开的Txt中) ......
  • D10
    D10Set子接口TreeSet存储结构:红黑树要求:元素必须要实现Comparable接口,compareTo方法返回值为0,认为是重复元素。Comparator:实现定制比较(比较器) Map父接口......
  • docker
    docker常用命令root权限进入容器dockerexec–it–urootpromrtheus/bin/sh复制文件从本地到服务器dockercp本地路径容器id或者容器名字:容器内路径复制......
  • 百度地图(BMapGL) 显示可视范围的插件 mapMaxBounds
    classmapMaxBounds{//map是百度的BMap实例对象//bounds是百度的可视范围类型BMap.bounds//这里的map类型在我开发的时候使用的是BMapGL......
  • 《GB28243-2012》PDF下载
    《GB28243-2012液压板料折弯机安全技术要求》PDF下载《GB28243-2012》简介本标准规定了液压板料折弯机的安全技术要求和措施;本标准适用于冷加工金属或部分是金属材料......