Shell脚本 | 性能测试之启动时间
安卓应用的性能测试,通常包括六个指标:启动时间、内存、CPU、耗电量、流量、流畅度。
除了耗电量,其他五个指标的数据在我们团队中已经可以通过运行脚本的方式获取到。
今天给大家分享下启动时间的脚本吧~
首先,我们先明确一下安卓应用的启动时间应该如何计算。在这里,我给出一条命令:
adb shell am start -W <Package_Name>/<Activity_Name>
"adb shell",安卓调试桥(Android Debug Bridge),这个大家都知道,不多解释。"am"指的是什么呢?Activity Manager,活动管理器,通过它可以启动App、启动Activity以及启动广播和服务等等。
安卓应用在启动时都会先出现一个欢迎页,它其实就是一个Activity。应用从被点击到出现欢迎页的这段时间,被定义为启动时间。在知道应用欢迎页的 Activity Name 后,就可以通过上面这条命令来获取启动时间。
图中的 "TotalTime" 即是本次启动所花费的时间,单位毫秒(ms)。
在知道启动时间的测试方法后,我们再来确定启动时间的不同场景。应用启动时间的场景差异,主要有四个:
1、首次安装:第一次下载应用后的启动时长;
2、覆盖安装:旧版本升级到新版本后的启动时长;
3、冷启动:杀掉应用的所有进程后的启动时长;
4、热启动:back键正常退出应用后的启动时长。
目前,我们团队的启动时间测试只包括首次安装、冷启动和热启动。
接下来,用脚本说话吧:
#!/bin/bash
# Author: Shengjie.Liu
# 安装应用,传入参数:apk文件的绝对地址
function install() {
adb install ${1}
sleep 5s
adb shell input keyevent 3
}
# 卸载应用,传入参数:应用包名
function uninstall() {
adb uninstall ${1}
sleep 2s
}
# 获取启动时间,传入参数:<包名>/<启动页活动名>
function getStartupTime() {
adb shell am start -W ${1} | grep -i Total | sed 's/ //g' | tr -d $'\r' | cut -d":" -f 2
sleep 2s
}
# 清除应用所有进程,传入参数:应用包名
function clearApp() {
adb shell am force-stop ${1}
sleep 10s
}
# Back键退出应用
function quitApp() {
adb shell input keyevent 4
adb shell input keyevent 4
adb shell input keyevent 4
sleep 2s
}
# 运行脚本后,提醒输入APK文件地址和包名&启动页活动名
read -p "请输入APK地址:" apk_address
read -p "请输入包名和活动名:" component
# 截取出包名赋值给变量"package_name"
package_name=$(echo ${component} | cut -d"/" -f1)
echo "Package name is '${package_name}'"
# 获取首次安装的启动时间,重复三次,最后取平均值
install ${apk_address}
starttime1=`getStartupTime ${component}`
uninstall ${package_name}
# 第二次
install ${apk_address}
starttime2=`getStartupTime ${component}`
uninstall ${package_name}
# 第三次
install ${apk_address}
starttime3=`getStartupTime ${component}`
sleep 20s
# 三次的启动时间
echo "首次安装时间(ms):$starttime1 $starttime2 $starttime3"
# 平均值
echo "($starttime1+$starttime2+$starttime3)/3" | bc
# The first installation time test is over, beginning warm boot test
quitApp
# 获取热启动的启动时间(同上,重复三次,取平均值)
starttime1=`getStartupTime ${component}`
quitApp
starttime2=`getStartupTime ${component}`
quitApp
starttime3=`getStartupTime ${component}`
quitApp
echo "热启动时间(ms):$starttime1 $starttime2 $starttime3"
echo "($starttime1+$starttime2+$starttime3)/3" | bc
# 获取冷启动的启动时间(同上,重复三次,取平均值)
clearApp ${package_name}
starttime1=`getStartupTime ${component}`
clearApp ${package_name}
starttime2=`getStartupTime ${component}`
clearApp ${package_name}
starttime3=`getStartupTime ${component}`
echo "冷启动时间(ms):$starttime1 $starttime2 $starttime3"
echo "($starttime1+$starttime2+$starttime3)/3" | bc
# 启动时间测试结束,卸载应用
uninstall ${package_name}
因为安卓手机的多样性,此脚本未做容错处理,部分手机在脚本运行过程中可能会弹出权限确认框或者其他界面,从而导致脚本运行失败。这个问题,大家可以根据自己手机的特性来做对应处理。
欢迎关注微信公众号“测试开发Stack”,更多原创文章第一时间发布!
Shell脚本 | 性能测试之启动时间的更多相关文章
- Shell脚本 | 性能测试之启动流量
安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣.(见文末参考链接) 今天我要分享的是通过脚本一键获取应用的启动流量 ...
- Shell脚本 | 性能测试之内存
性能测试中,内存是一个不可或缺的方面.比如说在跑 Monkey 的过程中,如何准确持续的获取到内存数据就显得尤为重要. 今天分享一个脚本,可以在给定时间内持续监控内存,最后输出成一份 CSV 文件,通 ...
- Shell脚本 | 性能测试之CPU占有率
Android 是一个基于 Linux 内核的移动操作系统,Linux 的 CPU 占有率的计算方式也可以应用到 Android App 上. 今天分享的这个脚本的功能,是在多核情况下计算进程的 CP ...
- App性能测试之启动时间(安卓)手动+脚本
这个测试可以使用adb工具,adb的安装方式 测试策略 安装后首次启动 常规冷启动 热启动(一般这个都很少测试) 针对1和2的测试方法 步骤1:在cmd中输入如下命令 adb logcat * > ...
- Linux 性能监控之CPU&内存&I/O监控Shell脚本2
Linux 性能监控之CPU&内存&I/O监控Shell脚本2 by:授客 QQ:1033553122 思路: 捕获数据->停止捕获数据->提取数据 备注:一些命令的输 ...
- Linux 性能监控之CPU&内存&I/O监控Shell脚本1
Linux 性能监控之CPU&内存&I/O监控Shell脚本1 by:授客 QQ:1033553122 #!/bin/bash # 获取要监控的本地服务器IP地址 IP=`if ...
- 小白日记7:kali渗透测试之主动信息收集-发现(一)--二层发现:arping/shell脚本,Netdiscover,scapy
主动信息收集 被动信息收集可能不准确,可以用主动信息收集验证 特点:直接与目标系统交互通信,无法避免留下访问痕迹 解决方法:1.使用受控的第三方电脑进行探测,使用代理 (做好被封杀的准备) 2 ...
- Shell脚本分析服务器性能
概述 我们原先在服务器上想分析性能指标,需要执行一系列的linux命令.对于linux命令不熟悉的人来说,比较困难 现在有一套集成的shell脚本,把常用的linux命令都包含在里面,一键式分析性能瓶 ...
- linux下对服务器性能监控shell脚本
#!/bin/bash #提取本服务器的IP地址信息 ENO1=`ifconfig | sed -n '1,1p' | awk -F ' ' '{print $1}'` IP=` -d -d &quo ...
随机推荐
- RuntimeException
Throwable Error ... Exception !RuntimeException RuntimeException 两类:checked exceptions 和 unchecked e ...
- LoadRunner改脚本
加action,不支持嵌套大括号 Action(){int iCt = 0; iCt = lr_output_message("abcdefg"); iCt = funA(3,5) ...
- 判断页面是app打开还是浏览器打开。cookie
有个需求需要对页面判断不同的打开方式来最里面的链接进行不同调整, 这样就要分四种情况,app,浏览器X安卓系统,苹果系统,起初是对页面url地址带有的参数(安卓)跟用户代理(苹果)返回值判断navig ...
- bootstrap代码(一)
一般在个人博客上使用的较为频繁,用于显示代码的风格.在Bootstrap主要提供了三种代码风格:1.使用<code></code>来显示单行内联代码2.使用<pre> ...
- owa2013配置HTTPS
- MS SQL的某一数据库成了Single User模式
数据库恢复失败,原来的数据却变成了 当尝试打开数据库的属性,即出现上面图片异常的信息. 正常来说,是可以打开数据库的属性 此刻,你可以运行SQL语句来解决: USE master; GO ALTER ...
- ubuntu14.04 下出现 libmysqlclient.so.20 找不到问题
解决办法: apt-get install libzdb-dev
- Mac下通过 brew 安装 Apache 和 PHP
Mac 自带的是php5.6 ,这里讲一下如果要升级到php7.1需要做的. 1.安装brew https://brew.sh/(官网有提供安装命令 建议使用) ruby -e "$(cur ...
- Windows 出现了回声 & 微软账号无法登陆
Windows 出现了回声,第一反应是杜比音效偷偷背着我开启了客厅模式(后面看了下并没有这个模式,后话了...). 再我尝试打开它发现提示网络无法连接,于是我就直接卸载了,但回声依能没有解决. 后面我 ...
- jQuery的ajax的post请求json格式无法上传空数组
问题描述:在和后端对接时,使用jquery的ajax的post方式向后端传递一序列约定好格式的对象数组.遇到了一个现象:如果对象中的数组是空数组,那么在请求参数中是不会出现的. 以下是数据的对比: ...