天天看點

Android UI 自動化測試(pytest+uiautomator2)

作者:魚柒柒

寫在前面

如今大部分公司的測試相關職位貌似隻有測試開發和測試工程師兩種了,而自動化測試工程師這個職位很少聽說了。因為現在對測試的要求已經越來越高,測試開發需要的技能幾乎已經和其他正常開發職位差不多了,而會自動化測試已經成了測試工程師的基本要求。

此篇會使用 pytest + uiautomator2 架構來實作 Android 平台的 UI 自動化測試。通過此篇文章你可以簡單地實作一個 Android UI 自動化的小 demo。更加深入的用法後面會有其他文章再來介紹。

此文章面向的是還不會自動化測試的測試工程師,是以預設你已經有移動端測試和 Android 手機調試的一些基本知識(開發者模式、adb 指令等)。同時你需要已經有一些 Python 語言基礎,如果對 Python 語言還不了解,請先通過一些教程學習 Python 相關的基礎知識。

希望可以通過本篇文章以及之後相關的文章可以讓想了解自動化測試的測試工程師朋友們有一些收獲。

環境搭建

首先安裝 Python3,可以在官網下載下傳自己電腦對應系統平台的安裝包進行安裝,請安裝 Python 3.6 以上版本。

然後選擇自己喜歡的代碼編輯器,Visual Studio Code 和 PyCharm 都挺推薦的,PyCharm 可以使用免費的社群版,社群版已經足夠我們的使用。

之後便是使用以下指令安裝我們自動化項目所用到的 Python 庫——pytest 和 uiautomator2

pip install pytest
pip install uiautomator2           

如果你電腦上安裝的有 Python2 和 Python3 兩個版本的 Python,可以是用 pip3 安裝。

接着請確定手機已打開開發者模式,并已允許調試,然後将手機連接配接至電腦。可以使用`adb devices` 來檢視已連接配接至電腦的手機清單。

手機連接配接上之後我們運作以下代碼初始化相關服務,此過程會安裝兩個 app 至連接配接的手機。

python3 -m uiautomator2 init           

元素定位

我們可以使用 Android SDK 自帶的 uiautomatorviewer 來進行元素定位,也可以使用 weditor。兩者相比, weditor 使用起來更友善,尤其是在使用 uiautomator2 來做 UI 自動化的時候會更友善。

運作以下指令安裝 weditor

pip install weditor==0.6.4           

直接安裝 weditor 最新版本可能會安裝失敗,嘗試下來 0.6.4 版本可以正常安裝。

安裝完成後指令行運作

python -m weditor           

運作完以上指令,會在浏覽器打開如下頁面

Android UI 自動化測試(pytest+uiautomator2)

weditor 打開預設界面

在頁面左上角輸入框輸入目前連接配接裝置的序列号(如果目前隻連接配接了一台裝置,也可以不輸入裝置序列号),然後點選“Connect”按鈕,連接配接成功後點選“Dump Hierarchy”按鈕左側就會顯示出手機目前的界面。滑鼠點選需要識别的元素,便會在中間顯示出該元素的 id、坐标等資訊,還會直接給出其對應的 XPath 表達式,友善我們定位元素。

Android UI 自動化測試(pytest+uiautomator2)

weditor 選擇元素

編寫代碼

測試檔案,測試類,測試方法命名

  • pytest 測試檔案需要以 test_*.py 或 *_test.py 格式命名,隻有以此種格式命名的檔案才會被識别為測試檔案。
  • pytest 測試類要以 Test 開頭
  • pytest 測試方法或測試函數需要以 test_開頭

隻有滿足以上規則的測試用例才會被 pytest 識别為自動化測試用例。

編寫 demo

我們建立 my_first_test.py 檔案,并寫入以下内容:

import time
import pytest
import uiautomator2 as u2


class TestExample:
    @pytest.fixture(scope="class")
    def driver(self):
        d = u2.connect()
        return d

    def test_of_add(self, driver):
        driver.app_start("com.android.bbkcalculator")
        driver(resourceId="com.android.bbkcalculator:id/digit1").click()
        driver(resourceId="com.android.bbkcalculator:id/plus").click()
        driver(resourceId="com.android.bbkcalculator:id/digit1").click()
        driver(resourceId="com.android.bbkcalculator:id/equal").click()
        time.sleep(1)
        result = driver(resourceId="com.android.bbkcalculator:id/edit_result_text").get_text()
        assert result == "2"
           

上面代碼實作了操作手機打開電腦,點選分别點選電腦上按鍵“1”,“+”,“1”,“=”,并斷言輸出結果是“2”。

當我們配置好手機,可以直接在檔案所在目錄下打開指令行輸入 pytest 并運作,正常情況下你會看到連接配接的手機會自動打開電腦,并完成 1 + 1 = 2 的加法運算。

代碼解析

上述代碼中前 3 行導入相關依賴包,第 6 行建立了測試類“TestExample”。

第 7-10 行中 driver 方法實作的是連接配接手機,電腦隻連接配接了一台手機時可以不傳任何參數,當電腦連接配接多台手機時需要傳入運作手機的 device id,不傳會預設選擇 devices list 的第一台手機。第 7 行的代碼表明了 driver 方法是一個 pytest 的 fixture 方法,它的作用範圍是 class,當它被調用的時候會在整個測試類運作之前運作一次。

第 12-20 行便是我們的測試用例,第 12 行将 driver 函數作為參數傳入調用了 fixture 函數,是以在測試運作之前會先運作 driver 方法連接配接上手機,并使 test_of_add 方法可以使用 u2.connect() 對象來控制手機進行操作。第 13 行代碼,實作的是啟動安裝包 com.android.bbkcalculator 也就是打開電腦,第 14-17 行控制手機實作計算 1 + 1 = 的操作。第 19 行為擷取計算結果,我們在此行之前的第 18 行加了個等待,避免程式運作太快,結果還沒顯示之前就去擷取結果造成斷言失敗。第 20 行便是進行斷言,斷言計算結果是否是“2”,此處需要注意我們擷取到的 result 是字元串,不可以直接斷言 result == 2。

由于不同品牌的安卓手機自帶電腦軟體并不相同,大家使用 weditor 定位一下自己手機電腦軟體上的元素,看下中間部分 *package 那裡顯示的包名以及電腦按鍵的 id 是否和代碼中一緻,不一緻的話可以修改成自己手機電腦的包名和對應的元素表達式。

寫在後面

閱讀上面的文章之後大家應該已經可以自己簡單地寫一個 demo 了,更加深入的對 pytest 和 uiautomator2 的使用我們之後再講解。

繼續閱讀