Android自動化測試工具實現簡述
前言
自動化測試在產品開發和測試中都有著非常重要的作用。在產品開發階段,可靠又重複性地執行以確保沒有引進迴歸問題;在產品測試階段,可以節省人力成本和時間成本,並能保證更大範圍的覆蓋。Android自動化測試工具同樣可以節省不少人力和時間成本,對其研究和實現對於提高測試效率具有一定的意義。目前市面上也有不少Android自動化測試工具,本人在現有工具的基礎上,加上自己的理解和實踐向大家介紹自動化測試工具的原理和實現。
瞭解自動化測試的一定對Robotium並不陌生,Robotium是一款國外的Android自動化測試框架,提供APK錄製和播放相關的API,不僅可以獲取APK執行時view相關的資料,還能模擬點選、輸入、滑動等等操作,本文的自動化測試工具是基於Robotium的二次開發。
自動化測試工具大體上可以分為錄製、播放、測試APK生成三部分,下面將通過分別介紹這三部分原理和實現。
一、錄製模組
錄製模組,顧名思義為錄下APK所有介面操作,並儲存相應的操作過程,包括延時、點選、輸入、滑動等。下面以“郵箱大師”登陸為例講述主要的技術。
1 、遍歷所有view
使用“uiautomatorviewer”工具,可以檢視當前介面所有的view,同樣可以使用Robotium提供的API獲取當前所有view,然後遍歷所有view,對不同的view做相應的操作。
2 、view事件的監聽
根據view的不同,選擇不同的偵聽方法,view包括EditText、ExpandableListView、WebView、Button等等,最後獲取相應的測試程式碼。監聽方法:獲取並儲存原始的view監聽器,然後為view註冊新的監聽器,繼承原始監聽器,並實現相應的錄製功能。
若為EditText,則新增TextWatcher 監聽文字變化,並記錄下對應edittext的index、text、resource-id等資訊。
若為登陸Button,則新增點選監聽事件,獲取所有點選事件,並記錄下當前resource-id、class、text等資訊。
監聽所有的view,當監聽事件觸發時,儲存當前view資訊,最後可以更好的根據獲取的錄製資訊,播放相應的錄製事件。
3 、view的查詢
在實際的錄製中,並不是所有的view都能獲取到“resource-id”,因此需要通過記錄其他資訊,以便播放時查詢到正確的view。
1)resource-id,id資訊是最好的標示view的方法
2)familyString,在id無法獲取或者無法定位的情況下,可以通過查詢該view家庭關係鏈(view在其父view的index,然後父 view的父view,直到父view為null)反向獲取正確的view。
3)textName,在以上方法都失效的情況下,可以通過view的text文字字串查詢view。
4)座標,在所有方法均無法定位的情況下,可以通過座標去定位,這樣就不能相容不同的解析度。
4 、錄製指令碼生成
通過監聽所有的view的操作,最後生成一個記錄了所有操作的指令碼檔案,用於播放測試。
二、播放模組
根據錄製的指令碼檔案,使用測試apk生成工具,即可生成一個播放apk,用於控制目標apk按照指令碼一步一步的執行。
與錄製模組中獲取view相關的資訊是反過程,播放模組是根據指令碼中的view資訊找到對應的view。播放用很多操作,包括dragPercent,clickOn,scrollListToLine,scrollScrollViewTo,enterText,clickOnExpandableListView,clickInList,sendKey,sleep等等。
若為“dragpercent”滑動操作,則可以直接呼叫Robotium中滑動的api:public void drag(float fromX, float toX, float fromY, float toY, int stepCount),實現從X點滑動到Y點,並定義了速度等級。滑動的播放在實際處理中也存在不少問題,特別是在一些翻頁操作中,滑動的快慢直接影響到滑動幾個頁面,因此錄製時速度確定也很關鍵。
若為clickOn點選,則可通過引數獲取獲取到view,然後呼叫performClick模擬點選,clickOn("id/button_login", "0", false),Robotium提供根據id獲取view的api,當然也可以通過familyString和className來獲取目標view,例如clickOn("android.widget.FrameLayout", "4-0-1-1-0-0-0-1-0-1-0-0-0-0-1", true);這樣通過familyString反向查詢。只要定位到view,就可以完成點選或者長按等操作。
對於view的獲取除了上面已經提到的id,familyString,還有index還有文字等,在Robotium中有相關的api,因此在錄製時可儘量多的儲存view相關的資訊,以便在播放時更容易的查詢到對應的view。
若為clickInList列表點選,clickInList(position, resourceId),則需要先根據resource-id或者familyString找到listview的view,然後通過position選擇對應的postion,最後呼叫performClick,即可點選對應list的列表。
還有其他一些操作,均可通過呼叫Robotium提供的API或者view方法去實現,在此不一一列舉。
三、測試APK生成工具
錄製模組生成指令碼,播放模組根據指令碼播放相應操作,但錄製apk怎麼生成,錄製生成的指令碼怎麼新增到播放模組中呢?測試APK生成工具就能解決這些問題。
由於自動化測試工具是基於Robotium的,Robotium又是基於Instrumentation的二次封裝,因此關聯測試APK和目標APK,需要目標APK和測試APK使用相同的簽名。測試APK分為錄製APK和播放APK,顯然錄製和播放的APK邏輯不同,本人實現的測試APK均基於recordreplay.apk修改而來,此APK實現了所有錄製和播放相關的邏輯,只需要修改AndroidManifest.xml和com.mytest.recordreplay.RecordReplay.java檔案即可生成不同的錄製和播放APK。
修改AndroidManifest.xml和java檔案的方法是先將recordreplay.apk使用apktool工具反編譯為xml和smali,然後修改AndroidManifest.xml和com.mytest.recordreplay.RecordReplay.smali檔案,再編譯成具體功能的recordreplay.apk,最後使用目標apk簽名檔案進行簽名。
1、 AndroidManifest.xml
基於Instrumentation均需要在AndroidManifest.xml做相應的申明。
2、 錄製RecordReplay.java
錄製APK的核心檔案RecordReplay.java,只需要修改下“LAUNCHER_ACTIVITY_FULL_CLASSNAME”即可完成對不同APK的處理。如下為一個錄製RecordReplay.java的demo。
3、 播放RecordReplay.java
播放APK的核心檔案RecordReplay.java,需要修改“LAUNCHER_ACTIVITY_FULL_CLASSNAME”為目標APK的啟動Activity,然後根據錄製模組中獲取到的指令碼檔案,轉化為方法“testRecorded”,同時可以在每個關鍵操作函式間新增截圖函式,這樣可以清楚的看到每一步的狀態,當然也可以根據需求,手動編寫相應的邏輯。如下為播放APK的demo。
自動化測試在產品開發和測試中都有著非常重要的作用。在產品開發階段,可靠又重複性地執行以確保沒有引進迴歸問題;在產品測試階段,可以節省人力成本和時間成本,並能保證更大範圍的覆蓋。Android自動化測試工具同樣可以節省不少人力和時間成本,對其研究和實現對於提高測試效率具有一定的意義。目前市面上也有不少Android自動化測試工具,本人在現有工具的基礎上,加上自己的理解和實踐向大家介紹自動化測試工具的原理和實現。
瞭解自動化測試的一定對Robotium並不陌生,Robotium是一款國外的Android自動化測試框架,提供APK錄製和播放相關的API,不僅可以獲取APK執行時view相關的資料,還能模擬點選、輸入、滑動等等操作,本文的自動化測試工具是基於Robotium的二次開發。
自動化測試工具大體上可以分為錄製、播放、測試APK生成三部分,下面將通過分別介紹這三部分原理和實現。
錄製模組,顧名思義為錄下APK所有介面操作,並儲存相應的操作過程,包括延時、點選、輸入、滑動等。下面以“郵箱大師”登陸為例講述主要的技術。
1 、遍歷所有view
使用“uiautomatorviewer”工具,可以檢視當前介面所有的view,同樣可以使用Robotium提供的API獲取當前所有view,然後遍歷所有view,對不同的view做相應的操作。
2 、view事件的監聽
根據view的不同,選擇不同的偵聽方法,view包括EditText、ExpandableListView、WebView、Button等等,最後獲取相應的測試程式碼。監聽方法:獲取並儲存原始的view監聽器,然後為view註冊新的監聽器,繼承原始監聽器,並實現相應的錄製功能。
若為EditText,則新增TextWatcher 監聽文字變化,並記錄下對應edittext的index、text、resource-id等資訊。
若為登陸Button,則新增點選監聽事件,獲取所有點選事件,並記錄下當前resource-id、class、text等資訊。
監聽所有的view,當監聽事件觸發時,儲存當前view資訊,最後可以更好的根據獲取的錄製資訊,播放相應的錄製事件。
3 、view的查詢
在實際的錄製中,並不是所有的view都能獲取到“resource-id”,因此需要通過記錄其他資訊,以便播放時查詢到正確的view。
1)resource-id,id資訊是最好的標示view的方法
2)familyString,在id無法獲取或者無法定位的情況下,可以通過查詢該view家庭關係鏈(view在其父view的index,然後父 view的父view,直到父view為null)反向獲取正確的view。
3)textName,在以上方法都失效的情況下,可以通過view的text文字字串查詢view。
4)座標,在所有方法均無法定位的情況下,可以通過座標去定位,這樣就不能相容不同的解析度。
4 、錄製指令碼生成
通過監聽所有的view的操作,最後生成一個記錄了所有操作的指令碼檔案,用於播放測試。
sleep(1000);
dragPercent(0.2515625f, 0.2515625f, 0.2107381f, 0.2107381f, 4);
sleep(7921);
enterText(0, "xxxx@163.com", false,"id/editor_email");
sleep(1298);
dragPercent(0.40390626f, 0.40390626f, 0.25851882f, 0.25851882f, 4);
sleep(7796);
enterText(1, "xxxxxxxx", false,"id/editor_password");
sleep(5690);
clickOn("id/button_login", "0", false);
二、播放模組
根據錄製的指令碼檔案,使用測試apk生成工具,即可生成一個播放apk,用於控制目標apk按照指令碼一步一步的執行。
與錄製模組中獲取view相關的資訊是反過程,播放模組是根據指令碼中的view資訊找到對應的view。播放用很多操作,包括dragPercent,clickOn,scrollListToLine,scrollScrollViewTo,enterText,clickOnExpandableListView,clickInList,sendKey,sleep等等。
若為“dragpercent”滑動操作,則可以直接呼叫Robotium中滑動的api:public void drag(float fromX, float toX, float fromY, float toY, int stepCount),實現從X點滑動到Y點,並定義了速度等級。滑動的播放在實際處理中也存在不少問題,特別是在一些翻頁操作中,滑動的快慢直接影響到滑動幾個頁面,因此錄製時速度確定也很關鍵。
若為clickOn點選,則可通過引數獲取獲取到view,然後呼叫performClick模擬點選,clickOn("id/button_login", "0", false),Robotium提供根據id獲取view的api,當然也可以通過familyString和className來獲取目標view,例如clickOn("android.widget.FrameLayout", "4-0-1-1-0-0-0-1-0-1-0-0-0-0-1", true);這樣通過familyString反向查詢。只要定位到view,就可以完成點選或者長按等操作。
對於view的獲取除了上面已經提到的id,familyString,還有index還有文字等,在Robotium中有相關的api,因此在錄製時可儘量多的儲存view相關的資訊,以便在播放時更容易的查詢到對應的view。
若為clickInList列表點選,clickInList(position, resourceId),則需要先根據resource-id或者familyString找到listview的view,然後通過position選擇對應的postion,最後呼叫performClick,即可點選對應list的列表。
還有其他一些操作,均可通過呼叫Robotium提供的API或者view方法去實現,在此不一一列舉。
三、測試APK生成工具
錄製模組生成指令碼,播放模組根據指令碼播放相應操作,但錄製apk怎麼生成,錄製生成的指令碼怎麼新增到播放模組中呢?測試APK生成工具就能解決這些問題。
由於自動化測試工具是基於Robotium的,Robotium又是基於Instrumentation的二次封裝,因此關聯測試APK和目標APK,需要目標APK和測試APK使用相同的簽名。測試APK分為錄製APK和播放APK,顯然錄製和播放的APK邏輯不同,本人實現的測試APK均基於recordreplay.apk修改而來,此APK實現了所有錄製和播放相關的邏輯,只需要修改AndroidManifest.xml和com.mytest.recordreplay.RecordReplay.java檔案即可生成不同的錄製和播放APK。
修改AndroidManifest.xml和java檔案的方法是先將recordreplay.apk使用apktool工具反編譯為xml和smali,然後修改AndroidManifest.xml和com.mytest.recordreplay.RecordReplay.smali檔案,再編譯成具體功能的recordreplay.apk,最後使用目標apk簽名檔案進行簽名。
1、 AndroidManifest.xml
基於Instrumentation均需要在AndroidManifest.xml做相應的申明。
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.test.target" />
同時,還需在Application標籤中嵌入如下宣告:
<uses-library android:name="android.test.runner" />
只需要根據目標APK的包名修改android:targetPackage的值“com.test.target”就可以完成AndroidManifset.xml檔案的修改。2、 錄製RecordReplay.java
錄製APK的核心檔案RecordReplay.java,只需要修改下“LAUNCHER_ACTIVITY_FULL_CLASSNAME”即可完成對不同APK的處理。如下為一個錄製RecordReplay.java的demo。
public class RecordReplay extends TestCase {
private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = " com.test.target.main ";
private static Class<?> launcherActivityClass;
static {
try {
launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public RecordReplay () {
super(launcherActivityClass);
}
@Override
protected void setUp() throws Exception{
super.setUp();
}
@Override
protected void tearDown() throws Exception{
super.tearDown();
}
public void test_StartRecord() {
baserecordreplay.beginRecordCode();
try {
Thread.sleep(10000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3、 播放RecordReplay.java
播放APK的核心檔案RecordReplay.java,需要修改“LAUNCHER_ACTIVITY_FULL_CLASSNAME”為目標APK的啟動Activity,然後根據錄製模組中獲取到的指令碼檔案,轉化為方法“testRecorded”,同時可以在每個關鍵操作函式間新增截圖函式,這樣可以清楚的看到每一步的狀態,當然也可以根據需求,手動編寫相應的邏輯。如下為播放APK的demo。
public class RecordReplay extends TestCase {
private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = " com.test.target.main ";
private static Class<?> launcherActivityClass;
static {
try {
launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public RecordReplay () {
super(launcherActivityClass);
}
@Override
protected void setUp() throws Exception{
super.setUp();
}
@Override
protected void tearDown() throws Exception{
super.tearDown();
}
public void testRecorded() {
baserecordreplay.sleep(1000);
baserecordreplay.screenShotNamed ("0");
baserecordreplay.recordReplay.dragPercent(0.2515625f, 0.2515625f, 0.2107381f, 0.2107381f, 4);
baserecordreplay.sleep(7921);
baserecordreplay.screenShotNamed ("1");
baserecordreplay.enterText(0, "xxxx@163.com", false,"id/editor_email");
baserecordreplay.sleep(1298);
baserecordreplay.screenShotNamed ("2");
baserecordreplay.recordReplay.dragPercent(0.40390626f, 0.40390626f, 0.25851882f, 0.25851882f, 4);
baserecordreplay.sleep(7796);
baserecordreplay.screenShotNamed ("3");
baserecordreplay.enterText(1, "xxxxxxxx", false,"id/editor_password");
baserecordreplay.sleep(5690);
baserecordreplay.screenShotNamed ("4");
baserecordreplay.recordReplay.clickOn("id/button_login", "0", false);
baserecordreplay.sleep(3000);
}
}
相關文章
- Android UI 自動化測試實現過程AndroidUI
- Junit測試Android自動化測試Android
- 如何實現高度自動化測試?
- Postman實現UI自動化測試PostmanUI
- 國產自動化測試工具
- 自動化測試工具QTPQT
- android自動化測試_uiautomator方案實現要點AndroidUI
- Android 下的自動化測試工具總結Android
- Python實現效能自動化測試竟然如此簡單Python
- API自動化測試平臺,高效實現對API的自動化測試API
- [android]android自動化測試Android
- 使用 Postman 實現 API 自動化測試PostmanAPI
- postman實現介面的自動化測試Postman
- 試著使用 jmeter 實現介面自動化測試JMeter
- 自動化測試:Monkey工具實踐應用~
- iOS自動化測試驅動工具探索iOS
- 自動化測試系列 —— UI自動化測試UI
- Android 談談自動化測試Android
- bats-Bash自動化測試工具BAT
- 微軟自動化測試工具palywright微軟
- Linux GUI自動化測試工具LinuxGUI
- [android]android自動化測試十三之monkeyRunner自動化框架Android框架
- 【自動化測試】移動端測試輔助工具 - adb
- 自動化測試工具分析和總結-實時更新
- Playwright自動化測試工具之元素定位實戰
- 使用 flow.ci 實現 Android 自動化測試與持續整合Android
- 如何實現工具無關化?關於自動化測試指令碼的設計指令碼
- UI自動化測試實戰UI
- API自動化測試實踐API
- [android]android自動化測試十四之dumpsys效能測試Android
- 如何從測試自動化中實現價值
- 用python實現selenium 自動化測試Python
- Java + SikuliX 基於影像實現自動化測試Java
- Python實現自動化測試入門指南Python
- 自動化測試工具Cucumber的簡單介紹,入門篇!
- Android 自動化測試之 MonkeyAndroid
- Android自動化測試解決方案Android
- [總結] 簡述 MySQL 基準測試工具MySql