测试工具-实现自动化获取app启动时间

前言

最近在给公司项目性能测试,这边列了性能测试的计划和场景,第一步就是获取公司项目和竞品的app启动时间,做下对比,这里就以笔记的形式记录一下

内容

一、获取app的包名和activity

其实这里折腾了挺久,因为一开始不太理解activity是什么,所以跟着网上的adb命令照着写,结果就一直出现报错(这里为了演示,包名我瞎打的)

查了很多资料,都是要我去ManifestFiles.xml里去修改,搞得头大

后来找到一篇文章

安卓 APP 专项启动时间监测小工具 · 测试之家

顺着这个文章找到了公众号,然后在里面发现了获取 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中。

各位大佬轻喷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值