基于Python的Android APP啟動耗時測試

1膝蜈、目的介紹

  • 本文主要通過Python 的os.popen()方法執(zhí)行adb命令锅移,進(jìn)行封裝非剃,達(dá)到自動化測試指定APP的冷啟動备绽、熱啟動疯坤。指定執(zhí)行次數(shù)深浮,取對應(yīng)平均值飞苇。

  • 冷啟動:啟動應(yīng)用時布卡,后臺沒有該應(yīng)用的進(jìn)程忿等,此時系統(tǒng)會重新創(chuàng)建一個新的進(jìn)程分配給該應(yīng)用贸街,這個啟動方式就是冷啟動狸相。

  • 熱啟動:啟動應(yīng)用時脓鹃,后臺已有該應(yīng)用的進(jìn)程(如:操作HOME鍵回返回至桌面瘸右,此時該應(yīng)用的進(jìn)程仍會保留在后臺,可在任務(wù)列表內(nèi)查看)苞俘,故在已有進(jìn)程的情況下苗胀,該種啟動會在已有的進(jìn)程內(nèi)來啟動應(yīng)用,這個方式叫熱啟動歌亲。

  • ADB命令執(zhí)行:http://www.reibang.com/p/3c226477aa46

2陷揪、獲取待測APP的包名以及Activity

  • 使用adb命令:adb shell dumpsys window | findstr "mCurrentFocus"
  • 注:常用adb命令總結(jié):http://www.reibang.com/p/d6340b67d9e3
  • 以手機(jī)QQ為例:連接手機(jī)悍缠,并進(jìn)入手Q主頁飞蚓,執(zhí)行adb命令獲取包名+activity
    如圖可見趴拧,手Q包名:'com.tencent.mobileqq'山叮,主頁activity:'com.tencent.mobileqq.activity.SplashActivity'


    手機(jī)QQ.png

3脑又、封裝腳本代碼

# -*- coding: utf-8 -*-

"""
@author: rzb
@software: PyCharm
@file: adbtest.py
@time: 2019/9/21 12:00
"""

import os
import re
import time


class MobileQQTest(object):

    def __init__(self, num):
        self.data = []
        self.num = num
        self.app = 'com.tencent.mobileqq'
        self.activity = 'com.tencent.mobileqq.activity.SplashActivity'

    def check_devices(self):
        '''檢查設(shè)備是否連接成功问麸,如果成功返回True口叙,否則返回False'''
        try:
            deviceInfo = os.popen('adb devices').read()
            if 'device' in deviceInfo.split('\n')[1]:
                print('=' * 21, '已連接設(shè)備,開始測試', '=' * 21)
                print(self.deviceInfo())
                return True
            else:
                return False
        except Exception as e:
            print(e)

    def deviceInfo(self):
        '''獲取設(shè)備基礎(chǔ)信息(如:廠商妄田、型號驮捍、系統(tǒng)版本)'''
        deviceName = os.popen('adb shell getprop ro.product.model').read()
        platformVersion = os.popen('adb shell getprop ro.build.version.release').read()
        producer = os.popen('adb shell getprop ro.product.brand').read()
        return "手機(jī)型號:%s %s东且,系統(tǒng)版本:Android %s" % (
            producer.replace('\n', ''), deviceName.replace('\n', ''), platformVersion.replace('\n', ''))

    def start_adb(self):
        '''運(yùn)行adb命令珊泳,并記錄啟動耗時'''
        start = 'adb shell am start -W %s/%s' % (self.app, self.activity)
        data = re.findall(r'.*ThisTime: (.*?)TotalTime:(.*?)WaitTime: (.*?)Complete',
                          os.popen(start).read().replace('\n', ''))
        if len(data) == 0:
            print("adb命令執(zhí)行出錯,數(shù)據(jù)為空")
        else:
            self.data.append(int(data[0][0]))
            return data

    def stop_adb(self):
        '''結(jié)束程序運(yùn)行'''
        stop = 'adb shell am force-stop %s' % self.app
        os.popen(stop)

    def run_test_cold(self):
        '''app 冷啟動耗時測試'''
        self.data.clear()
        if self.check_devices() == True:
            self.stop_adb()
            for i in range(self.num):
                print('=' * 20, '冷啟動測試:第%d次運(yùn)行' % (i + 1), '=' * 20)
                self.stop_adb()
                time.sleep(3)
                test = self.start_adb()
                print("ThisTime:%s,TotalTime:%s,WaitTime:%s" % (test[0][0], test[0][1], test[0][2]))
                time.sleep(3)
            self.stop_adb()
            print('\n冷啟動%s次平均耗時為:%s' % (len(self.data), sum(self.data) / len(self.data)))

        else:
            print("未連接安卓設(shè)備,請連接設(shè)備(3秒后重試)")
            while True:
                time.sleep(3)
                self.run_test_cold()

    def run_test_hot(self):
        '''app 熱啟動耗時測試'''
        self.data.clear()
        if self.check_devices() == True:
            os.popen('adb shell am start -W %s/%s' % (self.app, self.activity))
            time.sleep(3)
            for i in range(self.num):
                print('=' * 20, '熱啟動測試:第%d次運(yùn)行' % (i + 1), '=' * 20)
                os.popen('adb shell input keyevent 3')
                time.sleep(3)
                test = self.start_adb()
                time.sleep(3)
                print("ThisTime:%s,TotalTime:%s,WaitTime:%s" % (test[0][0], test[0][1], test[0][2]))
            self.stop_adb()
            print('\n熱啟動%s次平均耗時為:%s' % (len(self.data), sum(self.data) / len(self.data)))

        else:
            print("未連接安卓設(shè)備,請連接設(shè)備(3秒后重試)")
            while True:
                time.sleep(3)
                self.run_test_hot()


if __name__ == '__main__':
    apptest = MobileQQTest(4)
    apptest.run_test_cold()
    apptest.run_test_hot()

4、執(zhí)行結(jié)果展示

===================== 已連接設(shè)備,開始測試 =====================
手機(jī)型號:vivo V1824BA序无,系統(tǒng)版本:Android 9
==================== 冷啟動測試:第1次運(yùn)行 ====================
ThisTime:83,TotalTime: 83,WaitTime:114
==================== 冷啟動測試:第2次運(yùn)行 ====================
ThisTime:155,TotalTime: 155,WaitTime:188
==================== 冷啟動測試:第3次運(yùn)行 ====================
ThisTime:167,TotalTime: 167,WaitTime:197
==================== 冷啟動測試:第4次運(yùn)行 ====================
ThisTime:164,TotalTime: 164,WaitTime:193

冷啟動4次平均耗時為:142.25
===================== 已連接設(shè)備,開始測試 =====================
手機(jī)型號:vivo V1824BA帝嗡,系統(tǒng)版本:Android 9
==================== 熱啟動測試:第1次運(yùn)行 ====================
ThisTime:119,TotalTime: 119,WaitTime:148
==================== 熱啟動測試:第2次運(yùn)行 ====================
ThisTime:82,TotalTime: 82,WaitTime:105
==================== 熱啟動測試:第3次運(yùn)行 ====================
ThisTime:72,TotalTime: 72,WaitTime:92
==================== 熱啟動測試:第4次運(yùn)行 ====================
ThisTime:69,TotalTime: 69,WaitTime:92

熱啟動4次平均耗時為:85.5

Blog:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拔莱,隨后出現(xiàn)的幾起案子塘秦,更是在濱河造成了極大的恐慌动看,老刑警劉巖菱皆,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仇轻,死亡現(xiàn)場離奇詭異,居然都是意外死亡祭椰,警方通過查閱死者的電腦和手機(jī)方淤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門携茂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讳苦,“玉大人,你說我怎么就攤上這事钱慢∏涮茫” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長穗慕。 經(jīng)常有香客問我,道長怀各,這世上最難降的妖魔是什么瓢对? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任硕蛹,我火速辦了婚禮法焰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘埃仪。我一直安慰自己陕赃,他們只是感情好凯正,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桑滩,像睡著了一般运准。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胁澳,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天宇智,我揣著相機(jī)與錄音胰丁,去河邊找鬼。 笑死机蔗,一個胖子當(dāng)著我的面吹牛甘萧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牙言,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼嬉挡,長吁一口氣:“原來是場噩夢啊……” “哼汇恤!你這毒婦竟也來了因谎?” 一聲冷哼從身側(cè)響起财岔,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤河爹,失蹤者是張志新(化名)和其女友劉穎咸这,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酿雪,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了醋安。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吓揪。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡磺芭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钾腺,到底是詐尸還是另有隱情放棒,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布吴旋,位于F島的核電站荣瑟,受9級特大地震影響摩泪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜见坑,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一荞驴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霹娄,春花似錦、人聲如沸悲雳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至税弃,卻和暖如春则果,著一層夾襖步出監(jiān)牢的瞬間漩氨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工款青, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留抡草,地道東北人康震。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓签杈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铣除。 傳聞我的和親對象是個殘疾皇子尚粘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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