轉自: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框架結構
- 框架入口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內存監控與分析”