本人在作Android APP穩定性測試的過程當中,須要測試在不斷刷新首頁內容的場景下的穩定運行和性能數據的收集。最終根據UiAutomator+多線程解決了這個問題。思路以下:先用UiAutomator編寫好運行腳本,而後在使用快速調試的時候把調試命令輸出出來,而後在測試腳本中運行這個調試命令便可,固然還須要多線程來輔助記錄log和性能數據。java
多線程類代碼以下:android
package monkeytest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.Date; import source.Common; import source.PerformanceThread; public class HomeRefresh { public static String ADB_PATH = Common.ADB_PATH;; public static String package_name = Common.HEAD_PAGEKAGE; public static void main(String[] args) { // String timess = args[0]; // int times = Common.getInstance().changeStringToInt(timess); for (int i = 0; i < 3; i++) { Date start = Common.getInstance().getDate(); Logcat logcat = new Logcat();// 新建記錄log線程 PerformanceThread performanceThread = new PerformanceThread("homerefresh", package_name);// 性能監控 performanceThread.start(); logcat.start(); String command = "adb shell uiautomator runtest demo.jar --nohup -c happyjuzi.AppCase#testHomeRefresh"; execCmdAdb(command, "homerefresh" + getNow() + ".log"); logcat.stopLoacat(); performanceThread.stopRecord(); Date end = Common.getInstance().getDate(); Common.getInstance().outputTimeDiffer(start, end); } } /** * 執行adb命令 * * @param cmd * 命令內容 * @param fileName * 輸入文件路徑 */ public static void execCmdAdb(String cmd, String fileName) { System.out.println("執行命令:" + cmd); String OSname = System.getProperty("os.name"); Common.getInstance().saveToFile(Common.getInstance().getNow() + "開始!" + Common.LINE, fileName);// 保存 try { Process p = null; if (OSname.contains("Mac")) { p = Runtime.getRuntime().exec(ADB_PATH + cmd); } else { p = Runtime.getRuntime().exec("cmd /c " + cmd); } // 正確輸出流 InputStream input = p.getInputStream();// 建立並實例化輸入字節流 BufferedReader reader = new BufferedReader(new InputStreamReader(input));// 先經過inputstreamreader進行流轉化,在實例化bufferedreader,接收內容 String line = ""; while ((line = reader.readLine()) != null) {// 循環讀取 if (line.startsWith("// ")) { continue; } if (line.startsWith("//")) { Common.getInstance().saveToFile(line, fileName);// 保存 } if (line.contains("Exception")) { Common.getInstance().saveToFile("error-homerefresh" + getNow(), "error-homerefresh"+getNow()+".log"); } } reader.close();// 此處reader依賴於input,應先關閉 input.close(); // 錯誤輸出流 InputStream errorInput = p.getErrorStream();// 建立並實例化輸入字節流 BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorInput));// 先經過inputstreamreader進行流轉化,在實例化bufferedreader,接收內容 String eline = ""; while ((eline = errorReader.readLine()) != null) {// 循環讀取 Common.getInstance().saveToFile(eline, fileName);// 保存 } errorReader.close();// 此處有依賴關係,先關閉errorReader errorInput.close(); } catch (IOException e) { Common.getInstance().output("執行" + cmd + "失敗!"); e.printStackTrace(); } Common.getInstance().saveToFile(Common.LINE + Common.getInstance().getNow() + "結束!", fileName);// 保存 } /** * 獲取當前時間 * * @return 返回當前時間,只有日期和小時和分數沒有年份和秒數 */ private static String getNow() { Date time = new Date(); SimpleDateFormat now = new SimpleDateFormat("MM-dd-HH-mm"); String c = now.format(time); return c; } public void output(String text) { System.out.println(text); } public void output(Object... object) { if (object.length == 1) { output(object[0].toString()); return; } for (int i = 0; i < object.length; i++) { System.out.println("第" + (i + 1) + "個:" + object[i]); } } }
運行代碼以下,由於比較簡單,就只寫了方法部分的代碼。shell
public void testHeadHomeRefresh() { for (int i = 0; i < 20; i++) { startHead(); waitForUiObjectByResourceId("com.ss.android.article.news:id/b_y"); sleep(1000); for (int k = 0; k < 15; k++) { swipeDown(); sleep(1500); } stopHead(); } }