autoMonkey框架

轉自:https://blog.csdn.net/allan_shore_ma/article/details/78589230

【APP測試前瞻】 

當前移動互聯網已經過了草創時期,各家公司都在搶佔市場和用戶;那麼,就看哪一家做的更精緻(交互做的更好,崩潰出現的更少)。

Android用戶也許會經常碰到以下的問題: 
1.穩定性問題 —— ANR /Crash等問題;ANR(Application Not Responding)是指當Android系統監測到應用程序在5秒內沒有響應輸入的事件或廣播在10秒內沒有執行完畢時拋出無響應提示。Crash是指當應用程序出現錯誤時導致程序異常停止或退出的情況。 
2.性能問題 —— 應用啓動慢(首次/非首次啓動應用,進入應用特別慢),CPU不足/內存泄露(應用使用過程中,越來越卡),應用耗電快(應用後臺開着,手機很快沒電)等問題。

注:卡頓與ANR的問題。卡頓簡單的來說,就是手機沒有及時響應、頁面延遲,出現丟幀的現象,或者點擊無響應。絕大多數的卡頓,稍等片刻系統就會恢復正常,但假如超過5S,就可能會引發手機ANR警告。

APP測試涉及各個方面,而穩定性和性能測試一般在功能測試完成後開展。如何應用自動化測試場景,如圖1所示:

這裏寫圖片描述
圖1 自動化測試應用場景

自動化框架的選擇 
1.autoMonkey框架:Android平臺一般都會考慮使用系統自帶的Monkey工具進行測試,此工具既易上手也實用,但運用起來有非常多的講究和技巧,簡單的Monkey工具不一定能完成使命,在測試中也需要花費心思去對Monkey進行封裝改造(還可以修改原生的Monkey),以滿足測試需求。 
2.MBT(Model based testing):基於模型的測試。建模過程,通常是指對被測系統的某些方面的描述,以及對被測系統預期行爲的抽象描述。FSM(有限狀態機)用途最廣泛,一般用於黑盒測試的建模。MBT與Monkey測試理論的結合,即放一隻“猴子”在FSM模型中隨機漫遊,開展充分的穩定性測試。

本文是針對APP完成首輪功能測試後,使用autoMonkey框架進行穩定性和性能測試,從而提高產品的穩定性和留存率。知識結構分爲四個部分,如圖2所示:

這裏寫圖片描述 
圖2 autoMonkey框架原理與應用

四、autoMonkey框架 
根據上文對Monkey的介紹和分析,我們現在考慮如何封裝autoMonkey框架就比較容易了。個人選擇Windows系統下,以Python語言實現。基本思路是在Monkey測試的同時,再增加一個線程監測並記錄CPU、內存、流量和流暢度等信息。其他功能封裝在appShell.py和util.py兩個文件中,因爲代碼較多,具體實現下載源代碼測試策略通過time類獲取時間,區分白天工作時間,晚上和週末非工作時間(test_policy()方法)。如果要測試自己的APP,請在config.py中修改包名,如下:

# APP 包名
config['G_APP_PACKAGE_NAME'] = 'xxx.xxx'

框架結構,如圖7所示: 
1)框架入口:start.py 
2)參數預設:conf 
3)核心邏輯:core

這裏寫圖片描述 
圖7 autoMonkey框架結構

  1. 框架入口start.py,代碼如下:
# encoding=utf-8

import time
import datetime
import random
import threading
import unittest
from conf.config import config
from conf.setCondition import pre_condition, except_condition, post_condition, app
from core.util import createLogPath, combineTestResult


class AutoMonkey(unittest.TestCase):

    def setUp(self):
        # 創建log目錄
        create_log_path()
        # 配置初始化參數,啓動服務及記錄日誌等
        pre_condition()

    def test_monkey(self):
        # 生成一個線程,實時記錄內存、流量和流暢度等信息
        app.start()
        time.sleep(2)
        # monkey 測試
        package = config['G_APP_PACKAGE_NAME']
        for i in xrange(1, 5):
            # 記錄 logcat 日誌
            app.record_android_log(str(i) + config['U_LOGCAT_LOG'])
            try:
                print 'Round: {}'.format(i)
                seed = random.randint(100, 10000)
                count = random.randint(10000, 20000)
                monkey_log = str(i) + config['U_MONKEY_LOG']
                traces_log = str(i) + config['U_TRACES_LOG']
                # monkey 策略
                policy, count = test_policy()
                # 執行 monkey 命令,並保存日誌
                app.run_monkey(package, 'L2', seed, 500, count, monkey_log, policy)
                # 分析 monkey 測試日誌,統計結果
                res = app.analyze_monkey_log(monkey_log)
                if res == 0:
                    config['TEST_RESULTS']['PASS'] += 1
                elif res == -1:
                    config['TEST_RESULTS']['ANR'] += 1
                    # ANR時,導出 trace.txt 日誌
                    app.get_error_log(traces_log)
                elif res == -2:
                    config['TEST_RESULTS']['Exception'] += 1
                elif res == -3:
                    config['TEST_RESULTS']['CRASH'] += 1
                elif res == -4:
                    config['TEST_RESULTS']['OOM'] += 1
                elif res == -5:
                    config['TEST_RESULTS']['FAIL'] += 1
                # 結束 logcat 進程
                app.stop_running_process('logcat')
                # 結束 APP 進程
                app.stop_running_app(config['G_APP_PACKAGE_NAME'])
            except Exception as error:
                # 異常處理
                print str(error)
                except_condition(str(i))
        print 'Test Results: ', config['TEST_RESULTS']
        # 結束線程
        app.stop()

    def tearDown(self):
        # 生成測試報告,繪製手機資源使用趨勢圖
        combineTestResult(config['TEST_RESULTS'], config['TEST_DETAILS'])
        # 結束服務
        post_condition()

if __name__ == '__main__':
    unittest.main()

2.Monkey測試記錄樣例

1)Monkey測試結果概況,如圖8所示:

這裏寫圖片描述 
圖8 Monkey測試結果概況

2)被測手機的基本信息

這裏寫圖片描述
圖9 被測手機的基本信息

2)CPU使用趨勢圖,如圖10所示:

這裏寫圖片描述
圖10 CPU使用趨勢圖

3)內存使用趨勢圖,如圖11所示:

這裏寫圖片描述
圖11 內存使用趨勢圖

4)內存詳情趨勢圖,如圖12所示:

這裏寫圖片描述
圖12 內存詳情趨勢圖

5)引用未釋放的Activities趨勢圖,如圖13所示:

這裏寫圖片描述
圖13 引用未釋放的Activities趨勢圖

6)流量趨勢圖,如圖14所示:

這裏寫圖片描述
圖14 流量趨勢圖

7)流暢度趨勢圖,如圖15所示:

這裏寫圖片描述
圖 15 流暢度趨勢圖

PS:更多關於內存監控和分析,請參考個人博客“Android內存監控與分析”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章