Android App響應(yīng)時(shí)間測(cè)試方法研究

@作者 彭海波 轉(zhuǎn)載請(qǐng)注明出處

前言

啟動(dòng)時(shí)間和響應(yīng)時(shí)間是App帶給用戶的最直觀的性能體驗(yàn)抽减。因此,無論是何種類型的App橄碾,我們都不能忽視響應(yīng)時(shí)間的測(cè)試卵沉。本文結(jié)合Monkeyrunner和Appium自動(dòng)化工具法牲,研究了幾種響應(yīng)時(shí)間的測(cè)試方案。

測(cè)試場(chǎng)景分析

我們通常所說的App卡拒垃、慢通常就是由于啟動(dòng)時(shí)間或者頁(yè)面響應(yīng)時(shí)間過長(zhǎng)導(dǎo)致的。我們從這兩個(gè)方面戈毒,結(jié)合實(shí)際的用戶場(chǎng)景横堡,給出了幾種常用的測(cè)試場(chǎng)景。

測(cè)試場(chǎng)景 說明
App首次啟動(dòng)時(shí)間 從App啟動(dòng)到出現(xiàn)第一個(gè)可操作的頁(yè)面的時(shí)間間隔
App非首次啟動(dòng)的時(shí)間 同上
App啟動(dòng)到首頁(yè)加載出來的時(shí)間 從App啟動(dòng)到首頁(yè)完全加載出來的時(shí)間間隔
無網(wǎng)絡(luò)請(qǐng)求的頁(yè)面響應(yīng)時(shí)間 一般指從發(fā)起跳轉(zhuǎn)命贴,到頁(yè)面完全加載出來的時(shí)間間隔
有網(wǎng)絡(luò)請(qǐng)求的頁(yè)面響應(yīng)時(shí)間 同上

這些測(cè)試場(chǎng)景胸蛛,目前業(yè)內(nèi)也沒有成熟的測(cè)試方法。我們傳統(tǒng)的測(cè)試方法是掐秒表或者在代碼里面打日志葬项。但這樣誤差大,操作成本高零蓉,非常有必要改進(jìn)穷缤。下面我們就來討論一下我們的改進(jìn)思路。

測(cè)試方案研究

對(duì)于測(cè)試方法的衡量章喉,通常從兩個(gè)維度:準(zhǔn)確性和效率。而帶來這兩方面提升的方法一般是通過自動(dòng)化的手段來進(jìn)行秸脱。對(duì)于啟動(dòng)時(shí)間和響應(yīng)時(shí)間的測(cè)試,我們只做到了半自動(dòng)化咐蝇,但已經(jīng)從很大程度上提高了準(zhǔn)確度和效率巷查。

一、啟動(dòng)時(shí)間的測(cè)試(方案一)

方案背景:每個(gè)Activity的狀態(tài)是由它在Activity棧(是一個(gè)后進(jìn)先出LIFO岛请,包含所有正在運(yùn)行Activity的隊(duì)列)中的位置決定的。當(dāng)一個(gè)新的Activity啟動(dòng)時(shí)盅称,當(dāng)前的活動(dòng)的Activity將會(huì)移到Activity棧的頂部后室。
實(shí)現(xiàn)思路:一般app的啟動(dòng)頁(yè)面與首頁(yè)都不是同一個(gè)activity,當(dāng)啟動(dòng)結(jié)束的時(shí)候逞盆,啟動(dòng)activity都會(huì)被移除棧頂松申。因此,我們可以通過adb命令dump出當(dāng)前的棧頂activity贸桶,然后分析棧頂activity是否是啟動(dòng)activity來判斷是否app是否啟動(dòng)完成。

流程

環(huán)境依賴

  • Android SDK platform-tools
  • Android SDK tools
  • Python運(yùn)行環(huán)境

參考代碼

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os,sys
import random,time
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
import thread

def getlaunchtime(startActivity):
    #獲取App包名和啟動(dòng)activity
    #cmd = './tools/aapt %s | grep package' % apkpath
    #pkginfo = output.split("name=/'")[1].split("/' ")[0]
    #print pkginfo
    #等待主機(jī)與android設(shè)備連接
    device = MonkeyRunner.waitForConnection()
    MonkeyRunner.sleep(1)
    #殺掉待測(cè)程序,通常用于排除干擾
    cmd = 'am force-stop %s' % startActivity.split('/')[0]
    device.shell(cmd)
    running = True
    starttime = time.time()
    #print starttime
    endtime = time.time()
    #device.startActivity(component='com.pafinancialtech.shundebank/com.pingan.fstandard.activity.SplashActivity')
    device.startActivity(component=startActivity)
    #print out

    while running: 
        out = device.shell('dumpsys activity activities | grep mFocusedActivity')
        #print out
        if (out.find("SplashActivity") == -1):
            running = False
            endtime = time.time()
            #print endtime
    print "App launch time is : %s" %(endtime-starttime)

if __name__ == "__main__":
    getlaunchtime(sys.argv[1])

二水醋、啟動(dòng)時(shí)間的測(cè)試(方案二)

方案背景:Monkeyrunner提供一個(gè)圖片相似度對(duì)比分析的接口,可以按規(guī)定的相似度比較兩張圖片蝇恶,如果相似則返回true惶桐。
實(shí)現(xiàn)思路:截取一張App啟動(dòng)后首頁(yè)的屏幕截圖潘懊,作為對(duì)比標(biāo)準(zhǔn)贿衍,然后從App啟動(dòng)開始,一直截圖释树,同時(shí)與標(biāo)準(zhǔn)圖片進(jìn)行比較擎淤,如果達(dá)到相似度,則表示啟動(dòng)成功揉燃,記錄時(shí)間差作為啟動(dòng)時(shí)間炊汤。

流程二

環(huán)境依賴

  • Android SDK platform-tools
  • Android SDK tools
  • Python運(yùn)行環(huán)境

參考代碼

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import random,time
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage
def getlaunchtime(screenshot,startActivity):
    #等待主機(jī)與android設(shè)備連接
    device = MonkeyRunner.waitForConnection()
    #獲取初始頁(yè)面截圖弊攘,作為對(duì)比標(biāo)準(zhǔn)
    result = MonkeyRunner.loadImageFromFile(screenshot)
    #殺掉待測(cè)程序,通常用于排除干擾
    device.shell('am force-stop %s' % startActivity.split('/')[0])
    #啟動(dòng)待測(cè)程序的主activity
    device.startActivity(component=startActivity)
    #等待app啟動(dòng)完成
    #MonkeyRunner.sleep(15)
    starttime=time.time()
    while 1:
        current=time.time()
        mainPageImage=device.takeSnapshot()
        #print time.time()-current
        if(result.sameAs(mainPageImage,0.6)):
            launchtime=current-starttime
            print launchtime
            break
    
if __name__ == "__main__":
    getlaunchtime(sys.argv[1],sys.argv[2])
    

三迈倍、頁(yè)面響應(yīng)時(shí)間的測(cè)試

方案背景
Appium執(zhí)行自動(dòng)化測(cè)試的時(shí)候捣域,一般先定位頁(yè)面元素,然后再執(zhí)行操作迹鹅。因此贞言,我們可以通過判斷頁(yè)面的某個(gè)元素(一般是布局或者標(biāo)志性的元素)是否存在來判斷頁(yè)面是否加載完成。記錄這其中的時(shí)間差弟蚀,就可以得到頁(yè)面響應(yīng)時(shí)間酗失。
實(shí)現(xiàn)思路
我們?cè)谝涗涰?yè)面響應(yīng)時(shí)間的測(cè)試步驟后插入一個(gè)步驟,用于判斷某個(gè)頁(yè)面元素是否存在级零。然后點(diǎn)擊某個(gè)切換頁(yè)面的操作步驟的時(shí)間作為開始時(shí)間,通過Appium本身的元素查找功能鉴嗤,一直查找到元素,查找成功設(shè)置結(jié)束時(shí)間兔簇。

頁(yè)面響應(yīng)時(shí)間

依賴工具

測(cè)試結(jié)果示例
如下圖所示硬耍,計(jì)算出來的各個(gè)頁(yè)面的響應(yīng)時(shí)間如下:

響應(yīng)時(shí)間

總結(jié)

第一種測(cè)試方案是針對(duì)App啟動(dòng)時(shí)間的測(cè)試经柴;第二個(gè)方案是針對(duì)App啟動(dòng)到首頁(yè)加載的測(cè)試;同時(shí)也可擴(kuò)展于頁(yè)面響應(yīng)時(shí)間的測(cè)試坯认;第三鐘方案主要用于頁(yè)面響應(yīng)時(shí)間的測(cè)試。另外陋气,以上測(cè)試方案主要是針對(duì)啟動(dòng)時(shí)間和響應(yīng)時(shí)間自動(dòng)化測(cè)試的一種嘗試引润,由于工具本身的一些耗時(shí),計(jì)算可能會(huì)有一些誤差淳附。本解決方案只是作者的一個(gè)初步嘗試奴曙,作為拋磚引玉,希望大家有更好的思路拋出來一起研究缆毁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脊框,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子浇雹,更是在濱河造成了極大的恐慌,老刑警劉巖吠裆,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異诵棵,居然都是意外死亡祝旷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門距贷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吻谋,“玉大人,你說我怎么就攤上這事漓拾。” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵脯颜,是天一觀的道長(zhǎng)贩据。 經(jīng)常有香客問我,道長(zhǎng)饱亮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任剔宪,我火速辦了婚禮壹无,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斗锭。我一直安慰自己,他們只是感情好帮毁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烈疚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荧止。 梳的紋絲不亂的頭發(fā)上阶剑,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音牧愁,去河邊找鬼。 笑死兔朦,一個(gè)胖子當(dāng)著我的面吹牛磨确,可吹牛的內(nèi)容都是我干的沽甥。 我是一名探鬼主播乏奥,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼邓了,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了骗炉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤厕鹃,失蹤者是張志新(化名)和其女友劉穎乍丈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汗茄,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铭若,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞳腌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡儿捧,死狀恐怖挑宠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情懒鉴,我是刑警寧澤碎浇,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站悉默,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抄课。R本人自食惡果不足惜鞭缭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一魏颓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沦童,春花似錦叹话、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泵喘。三九已至,卻和暖如春相速,著一層夾襖步出監(jiān)牢的瞬間鲜锚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工旺隙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浆洗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓抠刺,卻偏偏與公主長(zhǎng)得像摘昌,于是被迫代替她去往敵國(guó)和親速妖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聪黎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容