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


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

    常规的UI自动化断言

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

    • 比较大小

    • 包含或者不包含

    • 验证布尔值

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

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

    Java 示例代码
    1. // 第一种 :比较大小
    2. String price = driver.findElement(By.xpath("//*[contains(@resource-id=\"current_price\")]")).getText();
    3. float currentprice = Float.parseFloat(price);
    4. float expectprice = 170;
    5. assert currentprice >= expectprice;
    6. // 第二种 :包含验证
    7. String name = driver.findElement(By.xpath("//*[contains(@resource-id=\"stockName\")]")).getText();
    8. assert name.contains("BABA");
    9. // 第三种 :布尔值验证
    10. @Test
    11. public boolean check(){
    12. List names = driver.findElements(By.xpath("//*[contains(@resource-id=\"stockName\")]"));
    13. return names.size() > 0 ? true : false;
    14. }
    15. @Test
    16. public void checkTest(){
    17. assert check();
    18. }

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

    Hamcrest断言

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

    Hamcrest 安装
    • Python 版本

    pip install pyhamcrest

    • Java 版本
    1. org.hamcrest
    2. hamcrest
    3. 2.2
    4. test
    Hamcrest 导包
    • Python 版本

    from hamcrest import *

    • Java 版
    1. import static org.hamcrest.MatcherAssert.assertThat;
    2. 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 版本
    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(@resource-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 wait1Test(){
    6. // 点击搜索输入框
    7. driver.findElementById("com.xueqiu.android:id/tv_search").click();
    8. // 输入 “alibaba”
    9. driver.findElementById("com.xueqiu.android:id/search_input_text").sendKeys("alibaba");
    10. // 点击“阿里巴巴”
    11. driver.findElementByXPath("//*[@text=\"阿里巴巴\"]").click();
    12. // 点击“股票”
    13. driver.findElementByXPath("//*[contains(@resource-id,\"title_container\")]//*[@text=\"股票\"]").click();
    14. // 获取股票价格
    15. By price_locator = By.xpath("//*[@text='09988']/../../..//*[@resource-id=\"com.xueqiu.android:id/current_price\"]");
    16. WebDriverWait wait = new WebDriverWait(driver, 10);
    17. WebElement ele = wait.until(ExpectedConditions.elementToBeClickable(price_locator));
    18. System.out.println(ele.getText());
    19. double currentPrice = Double.parseDouble(ele.getText());
    20. double expectPrice = 170;
    21. // 使用 hamcrest 断言来判断股票价格浮动在 10% 范围内
    22. assertThat(currentPrice, closeTo(expectPrice,expectPrice*0.1));
    23. }
    24. ...

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

    最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 相关阅读:
    操作系统第三周
    Python基础教程之四:Python中的变量的使用
    RestFul,会话技术,Fiddler
    AOP
    JavaScript 函数详解
    将企业内容管理(ECM)与企业流程集成的 8 个技巧
    docker run 中 选项-e 的使用
    景联文科技:打造亿级高质量教育题库,赋能教育大语言模型新未来
    layui select多选下拉显示 以及多值回显
    Redis缓存穿透、缓存雪崩和缓存击穿的解决方案
  • 原文地址:https://blog.csdn.net/NHB456789/article/details/134275015