前言
最近在给公司项目性能测试,这边列了性能测试的计划和场景,第一步就是获取公司项目和竞品的app启动时间,做下对比,这里就以笔记的形式记录一下
内容
一、获取app的包名和activity
其实这里折腾了挺久,因为一开始不太理解activity是什么,所以跟着网上的adb命令照着写,结果就一直出现报错(这里为了演示,包名我瞎打的)
查了很多资料,都是要我去ManifestFiles.xml里去修改,搞得头大
后来找到一篇文章
顺着这个文章找到了公众号,然后在里面发现了获取 activity 的adb命令
adb shell dumpsys window | findstr mCurrentFocus # 获得要测试的包名和启动页面的Activity
顺利拿到了包名和 Activity
二、启动时间的命令
adb shell am start -W [package_name]/[activity]
这边就把上面获得的数据替换就好
现在可以获取到应用时间了,也理解了什么是”冷启动“,”热启动“,”暖启动“的概念
但我发现每次的时间是有一定偏差的,那这样肯定就不能以某一次的时间为准了
那就需要去取一个平均值
三、用python写自动化
1、首先我先把装包,卸包,杀掉进程这些常用方法做了封装
# 装包
def install_apk(apk_path):
command = f'adb install {apk_path}'
subprocess.run(command, shell=True)
print("安装apk成功")
# 卸包
def uninstall_apk(apk_name):
command = f'adb uninstall {apk_name}'
subprocess.run(command, shell=True)
print("卸载apk成功")
# 杀掉进程
def kill_app(app_name):
command = f'adb shell am force-stop {app_name}'
subprocess.run(command, shell=True)
print("杀掉app成功")
2、然后这边写了三个获取时间的方法,分别是新装包、热启动、冷启动的时间
adb获取启动时间的命令,拿到数据,再从数据中拿到TotalTime的数值,返回后做一个取平均值的算法(哪来的算法,说的高端点hhh),最后打印结果
新装包启动时间
如果要测试新装包启动时间的平均值,时间比较久,所以我这边为了方便测试,没有写循环
# 新装包的启动时间
def get_startup_time(package, activity):
result = subprocess.run(f'adb shell am start -W {package}/{activity}',
shell=True, capture_output=True)
output = result.stdout.decode('utf-8')
lines = output.split("\n")
for line in lines:
if "TotalTime:" in line:
total_time = int(line.split(": ")[1])
return total_time
热启动时间
因为我没有找到退出进程(不杀掉)的方法,所以这边使用了Airtest里的home()方法,可以直接返回主界面
# 热启动时间获取
def get_hot_start_time(package, activity):
total_times = []
for _ in range(100):
home()
time.sleep(1)
result = subprocess.run(f'adb shell am start -W {package}/{activity}',
shell=True, capture_output=True)
output = result.stdout.decode('utf-8')
lines = output.split("\n")
for line in lines:
if "TotalTime:" in line:
total_time = int(line.split(": ")[1])
print(total_time)
total_times.append(total_time)
time.sleep(3)
total = sum(total_times)
average = total / len(total_times)
return average
冷启动时间
这里在获取启动时间的命令之前,加了一条关闭进程的adb命令
# 冷启动时间获取
def get_cold_start_time(package, activity):
total_times = []
for _ in range(100):
subprocess.run(f"adb shell am force-stop {package}")
time.sleep(1)
result = subprocess.run(f'adb shell am start -S -W {package}/{activity}',
shell=True, capture_output=True)
output = result.stdout.decode('utf-8')
lines = output.split("\n")
for line in lines:
if "TotalTime:" in line:
total_time = int(line.split(": ")[1])
print(total_time)
total_times.append(total_time)
time.sleep(3)
total = sum(total_times)
average = total / len(total_times)
return average
最后就是运行了
这边有两个项目需要测试(公司项目和竞品)
下班美滋滋点个运行,第二天来看结果就行了
def run(package, apk, activity):
uninstall_apk(package)
install_apk(apk)
new_start_time = get_startup_time(package, activity)
kill_app(package)
cold_start_time = get_cold_start_time(package, activity)
hot_start_time = get_hot_start_time(package, activity)
print(f'QiYu 新装包的启动时间为:{new_start_time} ms')
print(f'QiYu 热启动的平均值为:{hot_start_time} ms')
print(f'QiYu 冷启动的平均值为:{cold_start_time} ms')
if __name__ == '__main__':
run(QiYu_package_name, QiYu_apk, QiYu_activity)
run(ycjq_package_name, ycjq_apk, ycjq_activity)
总结
我知道代码写的非常丑陋,还有许多可以优化精简的地方,后续我会进一步扩展它,考虑添加更多的功能,比如记录日志、生成报告或者集成到CI/CD中。
各位大佬轻喷