智慧 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 測試的一個使用場景,希望能給你帶來幫助。

相關文章