智慧 Monkey 在指定執行的頁面範圍內執行方案

愛偷懶的QA發表於2021-01-11

在做移動端穩定性測試的時候,Monkey測試是首選的方案,但是在執行測試過程中也會存在問題。比如說,Monkey測試是隨機執行的,如果在執行過程中跳出了要執行的App,開啟的系統頁面或是其他應用的頁面。有的應用有地圖頁面,debug包的話也會有Debug工具等,直接影響Monkey的執行結果。為了達到測試指定App的效果,希望Monkey在App內的頁面上執行,是否有相應的方案呢?

一,修改測試App

通過在網上調研相關的技術,發現可以通過adb shell am start ActiviyName可以開啟指定的頁面。但是,出於安全考慮,正常開發的App是不能通過這個命令開啟頁面的,會報如下錯誤:

所以需要對被測試的App做修改,請參考:Andoird開發除錯時不修改Manifest直接啟動任意Activity的方法(https://www.jianshu.com/p/54fd9627860agitlab上下載一個可以執行Android)。經過測試,從 App Demo,通過Android Studio開啟專案,在app模組的build.gradle檔案下的android{}最後新增如下程式碼:

同時在最後新增:

// 啟動android:exported="true"的Activity
task startExportedTestActivity(type: Exec, dependsOn: 'installDebug') {
commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', 'cn.easydone.componentizationapp/com.linked.erfli.moduleb.news.NewsListActivity'
}

其中的Activity可以修改成你自己App的Activity。重新打debug安裝到手機上,就可以通過adb shell am start開啟相應的頁面。

二,開發Monkey測試用例

在做Monkey測試的時候,肯定不能直接使用命令列的方式來執行。需要藉助於自動化測試框架,如Appium來進行操作。這樣做的好處是:1,可以為Monkey測試做一些準備操作,如構造測試資料,登入被測App等。2,監控Monkey的執行,如對執行過程進行截圖,檢測當前執行的頁面等。
而要將Monkey在指定的頁面下執行,可以按如下思路來處理:
1,設定頁面白名單
通過配置檔案或是常量來指定要覆蓋的頁面白名單,如下所示:
//檔名:Constant.java
//頁面Activity白名單

public static String[] actlist={
"cn.easydone.componentizationapp/cn.easydone.componentizationapp.MainActivity",
"cn.easydone.componentizationapp/cn.easydone.modulea.LibraryActivity",
"cn.easydone.componentizationapp/com.linked.erfli.moduleb.news.NewsListActivity"
};

2,檢測當前頁面是否在白名單中
檢測當前頁面是否在白名單中,如果當前頁面在白名單中,則繼續執行Monkey測試,否則隨機開啟白名單中的一個頁面。實現程式碼如下:

/**
* 如果當前頁面不是指定的頁面,啟動app中的頁面
* @param actname
*/

public void startActiviyInApp(String actname){
//System.out.println("當前頁面是:"+actname);
String[] actlist= Constant.actlist;
List<String> activitylist= Arrays.asList(actlist);
//當前頁面不是白名單中的頁面
if(!activitylist.contains(actname))
{
int actindex=(int)(Math.random()*actlist.length);
//System.out.println("獲取第:"+actindex+"個頁面!");
String cmd = "adb -s " + Udid + " shell am start " + actlist[actindex];
LocalCommandLine.execute(cmd, 20000, true);
}
else
{
System.out.println("*****當前頁面在指定頁面範圍中*******");
}
}

3,非同步多執行緒啟動Monkey
在執行智慧Monkey測試的時候,可以通過java編寫多執行緒來進行執行。一個執行緒執行你設定的Monkey測試,如:

adb shell monkey -p com.jddl.rbr --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 100000

,讓Monkey按指定的時間去執行。另外啟動一個執行緒,去檢測當前的activity,對應的adb命令是:adb shell dumpsys window | grep mCurrentFocus,處理一下當前獲取的頁面內容。
根據你的測試需要,如每間隔3分鐘檢測一下,呼叫上面編寫的函式,檢測當前頁面是否在白名單中,如果不在記隨機啟動白名單的頁面,繼續執行Monkey測試。從而實現控制Monkey在指定的頁面範圍中執行。
穩定性測試在移動端專項中佔居重要位置,所以在不少移動測試平臺中會整合智慧Monkey測試。藉助於一定的移動端測試框架,不管是開源的Appium還是公司對移動框架做的二次開發,實現對Monkey測試的封裝,非同步多執行緒去執行Monkey測試。結合公司產品的特點,做前置的資料準備,登入,或是其他操作是比較常規的手段。本文介紹了智慧Monkey測試的一個使用場景,希望能給你帶來幫助。

相關文章