App性能测试之启动时间(安卓)手动+脚本
这个测试可以使用adb工具,adb的安装方式
测试策略
- 安装后首次启动
- 常规冷启动
- 热启动(一般这个都很少测试)
针对1和2的测试方法
步骤1:在cmd中输入如下命令
adb logcat * > D:\log.txt
步骤2:再在手机上打开将要测试的apk,apk启动完成后,cmd上按ctrl+c结束导入日志
步骤3:在D盘找到log.txt,ctrl+f,输入Displayed(搜索Displayed单词),Displayed后面有显示时间,有些app有多个Displayed,启动时间为所有Displayed时间的总和


此处的启动时间为609+738 (ms)
还有一个方法,可以获取到1,2,3的时间,如下
步骤一:获取测试apk的包名(可以问开发要),可以通过adb获取,
- 先启动apk
- 在cmd中输入命令:
adb shell dumpsys window w | findstr \/ | findstr name =
得到如下,其中name后面的则是需要的包名/组件
mSurface=Surface(name=com.sina.weibo/com.sina.weibo.VisitorMainTabActivity)
步骤二: 在cmd输入启动apk的命令,里面则有启动时间
adb shell am start -W -n com.sina.weibo/.VisitorMainTabActivity
输出如下,其中,ThisTime则为启动的总时间
Status: ok
Activity: com.sina.weibo/.VisitorMainTabActivity
ThisTime: 1326
TotalTime: 1326
WaitTime: 1354
Complete
毕竟手每次点要等待特别麻烦,那么就用python脚本来实现获得每次的启动时间吧。代码如下
#!/user/bin/python
# _*_ coding: utf-8 _*_
import csv
import re
import os
import time
Package_activity="com.sina.weibo/.VisitorMainTabActivity"
Packagename = "com.sina.weibo"
runnum = 10
class App():
def __init__(self):
self.content = ""
self.startTime = 0
self.flag = 1
def LauchApp(self):
cmd = "adb shell am start -W -n " + Package_activity
self.content = os.popen(cmd)
def StopApp(self):
if self.flag == 1:
cmd = "adb shell am force-stop " + Packagename
else:
cmd = "adb shell input keyevent 3"
os.popen(cmd)
def GetLaunchedTime(self):
for line in self.content.readlines():
if "ThisTime" in line:
self.startTime = line.split(":")[1]
break
print (self.startTime)
return self.startTime
class Controller(object):
def __init__(self):
self.app = App()
self.counter = 0
self.laughtime = [("timestamp","elapsedtime")]
def testprocess(self):
self.app.LauchApp()
elpasedtime = self.app.GetLaunchedTime()
time.sleep(3)
self.app.StopApp()
currenttime = self.getCurrentTime()
self.laughtime.append((currenttime,elpasedtime))
def run(self):
while self.counter > 0:
self.testprocess()
self.counter = self.counter - 1
def getCurrentTime(self):
currentTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
return currentTime
def SaveDataToCSV(self):
if self.app.flag == 1:
csvfile = file("coldstart_Time.csv","wb")
else:
csvfile = file("hotstart_Time.csv", "wb")
writer = csv.writer(csvfile)
writer.writerows(self.laughtime)
csvfile.close()
def coldLaugh_run():
controller = Controller()
controller.counter = runnum
controller.app.flag = 1
controller.run()
controller.SaveDataToCSV()
def hotLaugh_run():
controller = Controller()
controller.counter = runnum
controller.app.flag = 0
controller.run()
controller.SaveDataToCSV()
if __name__ == "__main__":
coldLaugh_run()
hotLaugh_run()
说明下:
a. 其中def SaveDataToCSV(self)这个函数中的file("hotstart_Time.csv", "wb"),python3将file改为open
b. adb安装apk
前提:需要把手机给root
命令:adb install 路径名/包名.apk
数据分析:
- 在得到数据后,我们一般将第一行数据去掉,取后几次数据分析
- 得到数据,我们要先算出平均值,再者就是要画出取线图查看波动情况
- 可与竞品对比此数据,做参考用以判断好坏
- 版本之间对比数据
- 一般冷启动的时间都在3-5s内
- 热启动启动的时间比冷启动要少
App性能测试之启动时间(安卓)手动+脚本的更多相关文章
- Android App性能测试之adb命令
本篇文章总结了Android App性能测试过程中常用的adb命令.通过这些adb命令,可以查看App的性能数据,为评判性能好坏作参考. CPU相关 显示占用CPU最大的5个应用 adb shell ...
- Shell脚本 | 性能测试之启动时间
安卓应用的性能测试,通常包括六个指标:启动时间.内存.CPU.耗电量.流量.流畅度. 除了耗电量,其他五个指标的数据在我们团队中已经可以通过运行脚本的方式获取到. 今天给大家分享下启动时间的脚本吧- ...
- Android App性能测试之二:CPU、流量
CPU---监控值的获取方法.脚本实现和数据分析 1.获取CPU状态数据 adb shell dumpsys cpuinfo | findstr packagename 自动化测试脚本见cpustat ...
- Android APP 性能测试之 GT 工具
一.介绍: GT(随身调)是 APP 的随身调测平台,它是直接运行在手机上的"集成调测环境"(IDTE, Integrated Debug Environment).利用 GT,仅 ...
- APP性能测试之卡顿比(FPS)
fps概念: FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数.FPS是测量用于保存.显示动态视频的信息数量.每秒钟帧数愈多,所显示的动作就会愈流畅. 卡顿人体感觉标准 ...
- Shell脚本 | 性能测试之启动流量
安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣.(见文末参考链接) 今天我要分享的是通过脚本一键获取应用的启动流量 ...
- 25条提高iOS App性能的建议和技巧
这篇文章来自iOS Tutorial Team 成员 Marcelo Fabri, 他是 Movile 的一个iOS开发者. Check out his personal website or fol ...
- 25条提高iOS App性能的技巧和诀窍
25条提高iOS App性能的技巧和诀窍 当我们开发iOS应用时,好的性能对我们的App来说是很重要的.你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢也会伤害到你的审核. 然而,由于IO ...
- 包建强的培训课程(9):Android App性能优化
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
随机推荐
- springboot+maven多模块工程dependency not found
参见:https://blog.csdn.net/m0_37943753/article/details/81031319. 重点是<dependencyManagement>标签的作用, ...
- 第二周博客作业 <西北师范大学| 周安伟>
一,本周助教小结 逐步开始适应助教工作,对学生发布的博客进行点评,查看学生对软件工程前期的准备情况. 二,助教本人博客 https://home.cnblogs.com/u/zaw-315/ 三,学生 ...
- ireport使用总结
ireport使用基础经验总结: 1.设置打印文件的纸张类型和大小 编辑->报表属性 2.设置纸张大小和空间(用于编辑打印内容) 鼠标右键空白处->栏的属性 以上所有部分共同组成打印 ...
- python学习中遇到的错误及解决办法
1. nodename nor servname provided 原因:Python程序中有段程序调用 socket.gethostbyname(socket.gethostname()) sock ...
- 关于vue中tamplate和DOM节点浅谈
前言:在开发前段页面使用vue时,我们能经常看到template标签.这里粗略讲下自己对vue中template理解和使用. 1. 先了解vue vue.js是一个轻巧.高性能.壳组件画的MVVM库. ...
- 使用Json.net对Json进行遍历
公司使用了一种伪Json, 当value为字符串并且以"@"开头时, 要替换成真实的值, 比如{"name":"@countryName"} ...
- JAVA多线程之线程间的通信方式
(转发) 收藏 记 周日,北京的天阳光明媚,9月,北京的秋格外肃穆透彻,望望窗外的湛蓝的天,心似透过栏杆,沐浴在这透亮清澈的蓝天里,那朵朵白云如同一朵棉絮,心意畅想....思绪外扬, 鱼和熊掌不可兼得 ...
- The Swap
源程序 swap.cpp* 输入文件 swap.in 输出文件 swap.out 时间限制 1s 空间限制 256MB [问题描述] Alice 得到了一个整数, 她将其视作长度为 n 的字符串 S. ...
- Servlet之过滤器(Filter)
一.概述 Servlet 过滤器是小型的 Web 组件,它们拦截请求和响应,以便查看.提取或以某种方式操作正在客户机和服务器之间交换的数据.这些组件通过一个配置文件来声明,并动态地处理,当在web.x ...
- 爬虫利器 Puppeteer 实战
Puppeteer 介绍 Puppeteer 翻译是操纵木偶的人,利用这个工具,我们能做一个操纵页面的人.Puppeteer是一个Nodejs的库,支持调用Chrome的API来操纵Web,相比较Se ...