天天看點

軟體測試/測試開發丨APP自動化Android之屬性擷取與斷言

公衆号搜尋:TestingStudio 霍格沃茲測試開發的幹貨都很硬核

斷言是 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 範圍區間浮動。