干货 | APP自动化Android之属性获取与断言

111 阅读3分钟

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

常规的UI自动化断言

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

  • 比较大小
  • 包含或者不包含
  • 验证布尔值

示例代码:

#比较大小
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")]')
              if len(name)!=0:
                      return True
                          else:
                                  return False
                                  assert check()
                                  
                                  ```
                                  
                                  上面的示例可以看出,Python 的 assert 是用来判断一个条件是否为真,如果它为真,就继续执行,如果为假,则抛出 AssertError 并且包含错误信息。断言可以在条件不满足程序运行的情况下直接返回错误。
                                  ## Hamcrest断言
                                  Hamcrest 是一个以测试为目的,能组合成灵活表达式的匹配器类库,用于编写断言的框架,使用这个框架编写断言,可以提高可读性以及开发测试的效率。Hamcrest 提供了大量被称为“匹配器”的方法。每个匹配器都设计用于执行特定的比较操作。Hamcrest 的可扩展性强,允许你创建自定义的匹配器,并支持多种语言。
                                  
                                  ## Hamcrest使用方法
                                  安装
                                  ```
                                  pip install pyhamcrest
                                  
                                  ```
                                  
                                  
                                  ```
                                  from hamcrest import *
                                  
                                  ```
                                  
                                  
                                  Hamcrest 提供了一个全新的断言语法(assert_that),可以只使用 assert_that 一个断言语句,结合 Hamcrest 提供的匹配符,就可以完成各种断言场景。
                                  常用方法 API
                                  
                                  1.比较两个字符串可以使用“equal_to”方法,示例代码如下:
                                  ```
                                  assert_that("this is a string",equal_to("this is a string"))
                                  
                                  ```
                                  
                                  2.数值匹配,比较两个值是否接近,可以使用“close_to”方法,用法:
                                  ```
                                  assert_that(8,close_to(10,2))
                                  
                                  ```
                                  
                                  解释:断言 8 接近于 (8 ~ 12)这个范围。
                                  3.包含某个字符,使用“contains_string”方法,示例代码如下:
                                  ```
                                  assert_that('abc',contains_string('d'))
                                  
                                  ```
                                  
                                  
                                  使用“雪球”应用,打开雪球 APP,点击页面上的搜索输入框输入“alibaba”,然后在搜索联想出来的列表里面点击“阿里巴巴”,选择股票分类,获取股票类型为“09988”的股票价格,最后验证价格在预期价格的 10% 范围浮动。示例代码片段如下:
                                  ```
                                  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))
                                                                                                                                                          
                                                                                                                                                          ```
                                                                                                                                                          
                                                                                                                                                          
                                                                                                                                                          上面的示例中,assert_that 是用于生成测试断言的样式化语句,比较两个值(current_price 与 expect_price)是否接近,断定实际值 current_price 在expect_price-expect_price*0.1 与expect_price+expect_price*0.1 范围区间浮动。
                                                                                                                                                          作为UI自动化测试三要素之一的断言,大家学会了么?下一篇我们来分享参数化用例,有兴趣的小伙伴可以关注一下哦!
                                                                                                                                                          
                                                                                                                                                          
                                                                                                                                                          内容全面升级,4 个月 20+ 项目实战强化训练,资深测试架构师、开源项目作者亲授 BAT 大厂前沿最佳实践,带你一站式掌握测试开发必备核心技能(对标阿里P6+,年薪50W+)!直推 BAT 名企测试经理,普遍涨薪 50%+!
                                                                                                                                                          
                                                                                                                                                          ### 
                                                                                                                                                          ⬇️ 点击“阅读原文”,提升测试核心竞争力!
                                                                                                                                                          [原文链接](https://mp.weixin.qq.com/s?__biz=MzU3NDM4ODEzMg==&mid=2247496129&idx=1&sn=4b77041f5829e32f9689a1dad9891610&chksm=fd31930aca461a1cc50c8c8e12876f8e82b7149952c909282ada8fc8f3869394c1d17ed47bc0#rd) 
                                                                                                                                                          
                                                                                                                                                          > 获取更多技术文章分享和免费资料领取点击链接:`https://qrcode.testing-studio.com/f?from=juejin&unid={times}&url=https://ceshiren.com/t/topic/16586
                                                                                                                                                          [获取更多技术文章分享和免费资料领取点击链接](https://qrcode.testing-studio.com/f?from=juejin&unid=1647844190&url=https://ceshiren.com/t/topic/16586)