1、目的介绍
本文主要通过Python 的os.popen()方法执行adb命令,进行封装,达到自动化测试指定APP的冷启动、热启动。指定执行次数,取对应平均值。
冷启动:启动应用时,后台没有该应用的进程,此时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。
热启动:启动应用时,后台已有该应用的进程(如:操作HOME键回返回至桌面,此时该应用的进程仍会保留在后台,可在任务列表内查看),故在已有进程的情况下,该种启动会在已有的进程内来启动应用,这个方式叫热启动。
2、获取待测APP的包名以及Activity
- 使用adb命令:adb shell dumpsys window | findstr "mCurrentFocus"
- 注:常用adb命令总结:https://www.jianshu.com/p/d6340b67d9e3
-
以手机QQ为例:连接手机,并进入手Q主页,执行adb命令获取包名+activity
如图可见,手Q包名:'com.tencent.mobileqq',主页activity:'com.tencent.mobileqq.activity.SplashActivity'
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):
'''检查设备是否连接成功,如果成功返回True,否则返回False'''
try:
deviceInfo = os.popen('adb devices').read()
if 'device' in deviceInfo.split('\n')[1]:
print('=' * 21, '已连接设备,开始测试', '=' * 21)
print(self.deviceInfo())
return True
else:
return False
except Exception as e:
print(e)
def deviceInfo(self):
'''获取设备基础信息(如:厂商、型号、系统版本)'''
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 "手机型号:%s %s,系统版本:Android %s" % (
producer.replace('\n', ''), deviceName.replace('\n', ''), platformVersion.replace('\n', ''))
def start_adb(self):
'''运行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命令执行出错,数据为空")
else:
self.data.append(int(data[0][0]))
return data
def stop_adb(self):
'''结束程序运行'''
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次运行' % (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("未连接安卓设备,请连接设备(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次运行' % (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("未连接安卓设备,请连接设备(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、执行结果展示
===================== 已连接设备,开始测试 =====================
手机型号:vivo V1824BA,系统版本:Android 9
==================== 冷启动测试:第1次运行 ====================
ThisTime:83,TotalTime: 83,WaitTime:114
==================== 冷启动测试:第2次运行 ====================
ThisTime:155,TotalTime: 155,WaitTime:188
==================== 冷启动测试:第3次运行 ====================
ThisTime:167,TotalTime: 167,WaitTime:197
==================== 冷启动测试:第4次运行 ====================
ThisTime:164,TotalTime: 164,WaitTime:193
冷启动4次平均耗时为:142.25
===================== 已连接设备,开始测试 =====================
手机型号:vivo V1824BA,系统版本:Android 9
==================== 热启动测试:第1次运行 ====================
ThisTime:119,TotalTime: 119,WaitTime:148
==================== 热启动测试:第2次运行 ====================
ThisTime:82,TotalTime: 82,WaitTime:105
==================== 热启动测试:第3次运行 ====================
ThisTime:72,TotalTime: 72,WaitTime:92
==================== 热启动测试:第4次运行 ====================
ThisTime:69,TotalTime: 69,WaitTime:92
热启动4次平均耗时为:85.5
Blog:
- 简书:https://www.jianshu.com/u/ec81abf35751
- CSDN:https://blog.csdn.net/qq_21238607
- 微信公众号:rzbbzr