APP 自動化測試介紹
目前 APP 自動化測試的方案:
自動化測試工具的選擇考量:
- 單平臺測試 or 多平臺測試?
- 是否有多裝置同時測試的場景?
- 不侷限於測試環境,任何版本任何環境都可以測試?
- 最擅長哪種開發語言?
- 當前市面是否有滿足專案需求的測試工具?是否需要二次開發?
Appium 介紹
什麼是 Appium ?
Appium 是一個開源的自動化測試框架,適用於原生的、混合的、移動端 Web 的應用程式,其使用 WebDriver 協議來驅動 iOS、Android 和 Windows 應用程式。
- 原生應用:指用 iOS、Android 或者 Windows SDKs 編寫的應用。
- 移動 Web 應用:指用移動端瀏覽器訪問的應用(Appium 支援 Safari、Chrome 和 Android 上的內建瀏覽器)。
- 混合應用:指帶有一個 WebView 的包裝器,用來和 Web 內容互動的原生空間。
Appium 優勢
開源免費
。跨平臺
:可以使用同一套 API 針對多個平臺(iOS、Android、Windows、Mac)編寫測試指令碼。支援多種型別的應用
:可以測試原生的、混合的、移動端 Web 專案。跨語言
:可以用任何程式語言編寫的 Appium 客戶端向 Appium 服務端傳送 HTTP 請求。底層多引擎可切換
。生態豐富,社群強大
。
Appium 跨平臺與跨語言:
-
Appium 支援 Selenium WebDriver 支援的所有語言,更可以使用 Selenium WebDriver 的 API。Appium 支援任何一種測試框架。如果只使用 Apple 的 UIAutomation,我們只能用 javascript 來編寫測試用例,而且只能用 Instruction 來執行測試用例。同樣,如果只使用 Google 的 UIAutomation,我們就只能用 Java 來編寫測試用例。Appium 實現了真正的跨平臺自動化測試。
-
Appium 選擇了 Client/Server 的設計模式,只要 Client 能夠傳送 HTTP 請求給 Server,那麼 Client 用什麼語言來實現都是可以的,這就是 Appium 及 WebDriver 能做到支援多語言的原因。
Appium 引擎列表:
-
IOS:
- The XCUITest Driver
(推薦)
- (DEPRECATED) The UIAutomation Driver
- The XCUITest Driver
-
Android:
- (BETA) The Espresso Driver
- The UiAutomator2 Driver
(推薦)
- (DEPRECATED) The UiAutomator Driver
- (DEPRECATED) The Selendroid Driver
-
Windows:
- The Windows Driver (for Windows Desktop apps)
-
Mac:
- The Mac Driver (for Mac Desktop apps)
Appium 架構
Appium 使用的是 C/S 架構
:
工作流程:
- 啟動 Appium 服務端(預設開啟 4723 埠),接收來自 Appium 客戶端的連線,監聽指令。
- Appium 客戶端通過執行指令碼,將指令轉換成 JSON Wire 協議規定的 JSON 格式資料,通過 HTTP 請求 post 給 Appium 服務端,在第一次連線時便會建立一個 session 會話。
- Appium 服務端接收到指令後(實現對 JSON Wire 協議的處理),基於 Socket 將指令傳送給代理程式(Bootstrap.jar/ Bootstrap.js),安裝在手機上的 Bootstrap 監聽 4724 埠並接收 Appium 的命令。
- Bootstrap 代理程式接收到指令後,通過呼叫移動裝置(Android/iOS)自帶的測試框架(UIAutomator/UIAutomation)執行這些指令,進行 UI 操作。
- 執行完畢後,將執行結果以 HTTP 響應的方式返回給 Appium 服務端,再由 Appium 服務端返回給 Appium 客戶端。
Appium 生態
adb
:Android 的控制工具,用於獲取 Android 的各種資料和控制。
Appium Client
:即編寫的自動化指令碼(支援多種語言,如 Python、Java 等),使用 JSONWire 協議與 Appium 服務端進行通訊,即給服務端傳送請求會話來執行自動化任務。Appium Server
:Appium 的服務端,即一個 Web 介面服務,使用 Node.js 編寫的 HTTP 伺服器,用於處理 Appium 客戶端傳送過來的指令。Appium Desktop
:一款適用於 Mac、Windows 和 Linux 的開源應用程式(封裝了 Appium Server 和 inspector 的綜合工具),它以美觀而靈活的使用者介面提供 Appium 自動化伺服器的強大功能。AppCrawler
:自動遍歷工具。
Appium 元件
UIAutomator
:由谷歌推出的一款 UI 測試框架,提供 API 對 Android 系統進行一系列的自動化測試操作,Android 4.2 之後系統自帶的 UI 自動化測試工具。UIAutomation
:由蘋果公司釋出的一個測試框架,主要用於自動化測試 iOS 和 OS X 應用的 UI 互動情況,iOS 系統自帶的 UI 自動化測試工具。Bootstrap.jar
:Appium 在 Android 上基於 UIAutomator 實現的測試代理程式,可以呼叫 UIAutomator 的方法實現一系列 UI 操作。Bootstrap.js
:Appium 在 iOS上基於 UIAutomation 實現的測試代理程式,可以呼叫 UIAutomation 的方法實現一系列 UI 操作。
UiAutomator API
UiAutomator 對外提供了很多方法,便於 UI 自動化測試呼叫執行。
API | 說明 |
---|---|
UiDevice | 操作物理按鍵、拖拽、滑動、通知欄、截圖等,如 pressHome、pressRecentApps、pressKeyCode、waitForIdle、drag、swipe、isScreenOn、openNotification、openQuickSetting 等。 |
UiSelector | 可通過 Text、description、class、package、index 等屬性定位。獲取到的 UiSelector 可通過 UiObject 封裝後進行操作。 |
UiObject | click、drag、swipe、setText、屬性獲取、是否存在等方法。 |
UiCollection | 是 UiObject 的子類,是控制元件的集合,如計算器是數字按鍵。 |
UiScrollable | 是 UiObject 的子類,滾動控制元件。 |
Bootstrap 類的實現
package io.appium.android.bootstrap;
import io.appium.android.bootstrap.exceptions.SocketServerException;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
/**
* The Bootstrap class runs the socket server. uiautomator開發的指令碼,可以直接在pc端啟動
*/
public class Bootstrap extends UiAutomatorTestCase {
public void testRunServer() {
SocketServer server;
try {
// 啟動socket伺服器,監聽4724埠。
server = new SocketServer(4724);
server.listenForever();
} catch (final SocketServerException e) {
Logger.error(e.getError());
System.exit(1);
}
}
}
從原始碼中能夠看到:
- 這個類是繼承 UiAutomatorTestCase 的,這樣它就能被 UIAutomator 作為測試用例類來執行了。而 UiAutomatorTestCase 類是繼承自 Junit TestCase,可以直接使用它的一些方法和 Junit 單元測試框架中的 Assert 斷言機制。
- Bootstrap 建立一個 SocketServer 並監聽 4724 埠,通過該埠可以與 Appium 服務端進行通訊。
- 通過迴圈監聽獲取 Appium 服務端傳送過來的指令,就可以進行相應的處理了。
Appium 與 Robotium 的區別
Appium:
- Appium 是基於 UIAutomator 框架實現的。
Appium 測試程式與目標應用程式是分開的
,所以 Appium 不能直接訪問目標應用的各種 element 屬性進行 Copy&Paste,而只能模擬觸發相應的事件對目標應用進行操作。
Robotium:
- Robotium 是基於 Instrumentation 框架的。
Robotium 測試程式與目標應用是在同一個程式中作為兩個不同的執行緒執行的
。也就是說 Robotium 測試執行緒是有辦法直接訪問目標應用的各種 element 屬性的,可以訪問浮層、Intent 之類的,所以它根本不需要觸發任何事件,直接就可以在內部修改相應的資料。
以文字輸入為例:
- Robotium 是直接 Copy&Paste,所以效率當然會更高;特別是在長字串輸入時,如輸入一篇文章,如果在 Appium 上呼叫鍵盤,當安卓裝置效能不高的情況下,會明顯感覺到卡頓。
- Robotium 因為不需要調出鍵盤,所以很容易就能輸入各種不同語言;而 Appium 就不一樣了,如果當前輸入法為英文而你需要輸入中文,那麼你要去設定應用把語言設定成中文或選擇中文輸入法等,然後再切換到目標應用進行輸入操作。
總結:
-
Appium 更能模擬使用者的行為操作;而 Robotium 偏向測試金字塔更底層點的 Unit Test(所以 Robotium 除了能支援測試目標應用的 Activity 外,還能測試 Content Provider 等)。
-
Appium 是基於 WebDriver 協議新增對移動裝置自動化 API 擴充套件而成的,所以具有和 WebDriver 一樣的特性,很多語法也是保持一致的,從而減少了學習成本
。
Appium 自動化測試環境搭建
安裝 Node.js
下載 node.js,根據作業系統下載對應的安裝包。
安裝完成後,會自動將路徑加入到環境變數中,在命令列視窗中執行 node -v,如果出現版本號,表示安裝正常。
安裝 JDK
安裝並配置好環境變數後,新開啟一個命令列視窗,在其中輸入 java -version,若出現 JDK 的版本號,表示配置正確。
安裝 Android SDK
Android SDK 是 Google 提供的 Android 開發工具包,可以通過引入工具包來呼叫 Android 的 API。
1)Android SDK 下載
考慮到有可能會打不開這個連結,提供一個中文社群的 SDK 下載連結
2)安裝 API 版本和對應的工具包
雙擊開啟 SDK Manage.exe,選擇需要安裝的 API 版本和對應的工具包進行安裝,這些在執行模擬器和真機測試的時候會使用到。
安裝包很多,哪些是必須的呢?根據官方文件的描述:
- SDK Tools:必須
- SDK Platform-tools:必須
- SDK Platform:必須至少安裝一個版本
- System Image:建議安裝
- Android Support:建議安裝
- SDK Samples:建議安裝
這些工具包都安裝完成後,SDK 的目錄如下圖所示:
問題:Android SDK Manager 國內無法更新的解決方案
- 啟動 Android SDK Manager ,開啟主介面,依次選擇「Tools」、「Options…」,彈出『Android SDK Manager - Settings』視窗。
- 在『Android SDK Manager - Settings』視窗中,在「HTTP Proxy Server」和「HTTP Proxy Port」輸入框內填入 mirrors.neusoft.edu.cn 和 80,並且選中「Force https://… sources to be fetched using http://…」核取方塊。設定完成後單擊「Close」按鈕關閉『Android SDK Manager - Settings』,視窗返回到主介面。
- 依次選擇「Packages」、「Reload」。
3)配置 SDK 的環境變數
在 Path 中配置:
- %ANDROID_HOME%\platform-tools
- %ANDROID_HOME%\tools
配置好環境變數後,在命令列視窗中執行 adb -version,出現以下資訊則表示配置正確:
安裝 Python(客戶端測試指令碼所用語言)
安裝好後將 Python 安裝目錄配置到環境變數 Path 中,然後在 cmd 中執行 Python 命令:
安裝 Appium Server
- 可選擇 Appium Server 版如 Appium-windows-1.12.1.exe:安裝完成後會在桌面生成快捷方式,每次啟動快。
- 或選擇 Appium Desktop 版如 appium-desktop-Setup-1.5.0-ia32.exe:Appium Desktop 封裝了 Appium server 和 Node.js,且不會生成安裝目錄和快捷方式,每次啟動等待時間長,但功能更加穩定(如桌面版 start session 獲取元素屬性)。
點選 start server 後出現如下圖,則 Appium 安裝成功。
下載 Appium Client
這裡選擇 Python,下載連結。
- 下載後解壓到 Python 的安裝目錄,進入目錄下,執行 python setup.py install 命令。
- 或者在命令列中執行 pip install Appium-Python-Client。
安裝完成後,進入 Python 命令列環境,輸入 from appium import webdriver,出現如下圖則說明 Appium-Python-Client 安裝成功。