Android 性能测试之内存 --- 追加腾讯性能案例,安卓抓取性能扫盲帖
内存测试:
思路
- 目前做的是酒店APP,另下载安装几个个第三方酒店的APP以方便对比(相当于可以做竞品测试)
- 数据的获取来源是ADB底层命令,而且最好是不需要root权限,因为很多手机root很麻烦或者无法root
- 获取数据之后需要存储到excel表单,然后根据数据自动进行绘图形成简单的曲线图用于观察
- 记录数据的过程可以用Monkey操作/手工操作,后期也可以考虑加入自动化测试用例进行联动
疑问:
此APP是需要登录的,MONKEY测试过程中退出账号后无法再进入程序内部,不知道其他公司是如何避免的?
答:经咨询,目前常用两种做法:1. 让开发将退出按键给屏蔽掉 2.点击登录不检测账号和密码
一、运行Monkey
- 将白名单push到手机 ``` adb push E:\\whitelist.txt data/local/tmp/
- 运行monkey
adb shell
monkey -pkg "packageName" -whitelist-file /data/local/tmp/whitelist.txt --throttle 200 -s 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v 15000 2>/sdcard/error.txt 1>/sdcard/info.txt
二、获取内存
移动端关注的是内存消耗,这个测试节点的设计目标是为了让应用不占用过多的系统资源,且及时释放内存,保障整个系统的稳定性,当然关于内存测试,在这里我们需要引入几个概念,
- 空闲状态
- 中等规格
- 满规格,
空闲状态:指打开应用后,点击home键让应用后台运行,此时应用处于的状态叫做空闲。 中等规格和满规格指的是对应用的操作时间的间隔长短不一,中等规格时间较长,满规格时间较短。
接下来我们说说在内存测试中,存在很多测试子项,如下清单所示
1.空闲状态下的应用内存消耗情况
2.中等规格状态下的应用内存消耗情况
3.满规格状态下的应用内存消耗情况
4.应用内存峰值情况
5.应用内存泄露情况
6.应用是否常驻内存
7.压力测试后的内存使用情况
说了一些关于内存测试方面的设定,接下来我们聊聊测试方法DIY,现在关于android内存测试的方法基本分为几类,
1.使用 android 本身提供的 ActivityManager.MemoryInfo() 方法获得(此方法请百度或google)此类第三方工具有如网易的Emmagee、安测试、腾讯的GT等
2.使用 android 提供的 adb shell dumpsys meminfo |grep packagename
>/address/mem.txt 来获取
3.使用 android 提供的 procrank
一般地,我们需要测试native heap, dalvik heap,Pss Total 内存(详解看下面的MemoryInfo解析)
这里我们详解一下 procrank 方法(批处理)
1.首先去google获取procrank、procmem、libpagemap.so 三个文件 .
2.然后push文件,
执行 adb push procrank /system/xbin
adb push
procmem /system/xbin
adb push
libpagemap.so /system/lib
3.赋权 adb shell chmod 6755 /system/xbin/procrank
adb shell
chmod 6755 /system/xbin/procmem
adb shell chmod
6755 /system/lib/libpagemap.so ,
在开启工具记录 adb shell procrank |grep packagename
>/address/procrank.txt
剩下的就是整理测试数据了
关于内存泄露方面的测试,可以通过几个方面来测试
1.通过monkey压力测试记录内存使用情况,分析数据曲线图及日志情况
2.通过eclipse上的mat+heap来分析存在内存泄露方面的节点
三、数据分析与内存详解
三、数据分析与内存详解
【将收集到的性能数据保存到excel中】
MemoryInfo解析:
Naitve Heap Size: 从mallinfo usmblks获得,代表最大总共分配空间
Native Heap Alloc: 从mallinfo uorblks获得,总共分配空间
Native Heap Free: 从mallinfo fordblks获得,代表总共剩余空间
Native Heap Size 约等于Native Heap Alloc + Native Heap Free
mallinfo是一个C库, mallinfo 函数提供了各种各样的通过C的malloc()函数分配的内存的统计信息。
Dalvik Heap Size:从Runtime totalMemory()获得,Dalvik Heap总共的内存大小
Dalvik Heap Alloc: Runtime totalMemory()-freeMemory() ,Dalvik Heap分配的内存大小。
Dalvik Heap Free:从Runtime freeMemory()获得,Dalvik Heap剩余的内存大小。
Dalvik Heap Size 约等于Dalvik Heap Alloc + Dalvik Heap Free
OtherPss, include Cursor,Ashmem, Other Dev, .so mmap, .jar mmap, .apk mmap, .ttf mmap, .dex mmap, Other mmap, Unkown统计信息都可以在process的smap文件看到。
Objects and SQL 信息都是从Android Debug信息中获得。
其他类型 smap 路径名称 描述
Cursor /dev/ashmem/Cursor Cursor消耗的内存(KB)
Ashmem /dev/ashmem 匿名共享内存用来提供共享内存通过分配一个多个进程
可以共享的带名称的内存块
Other dev /dev/ 内部driver占用的在 “Other dev”
.so mmap .so C 库代码占用的内存
.jar mmap .jar Java 文件代码占用的内存
.apk mmap .apk apk代码占用的内存
.ttf mmap .ttf ttf 文件代码占用的内存
.dex mmap .dex Dex 文件代码占用的内存
Other mmap 其他文件占用的内存
代码实现实例(抓取内存,python 2.7) :
class MemProfiler(BaseProfiler):
def __init__(self, pid, adb, loghd):
BaseProfiler.__init__(self, adb)
self.appPid = pid
# self.adb = adb
self.loghd = loghd
self.PSSList = []
self.NativeHeapList = []
self.DalvikHeapList = []
self.lastRecord = {}
# 统计总内存,NATIVE内存,DALVIK内存
self.titile = ["总内存(MB)", "NativeHeap(MB)", "DalvikHeap(MB)"] # self.androidversion = 0 def init(self):
self.androidversion = self.getAndroidVersion() def timeout(self, p):
if p.poll() is None:
self.loghd.info('appmonitor Error: process taking too long to complete--terminating')
p.kill() def getProcessMem(self):
if HEAP_PROFILE == False:
return 0, 0, 0 cmdProcess = self.adb.cmd("shell", "dumpsys", "meminfo", self.appPid)
output = ""
my_timer = Timer(30, self.timeout, [cmdProcess])
try:
my_timer.start()
output = cmdProcess.communicate()[0].decode("utf-8").strip()
except ValueError as err:
self.loghd.info(err.args)
finally:
my_timer.cancel() m = re.search(r'TOTAL\s*(\d+)', output)
native = r'Native Heap\s*(\d+)'
dalvik = r'Dalvik Heap\s*(\d+)'
if int(self.androidversion) < 19:
native = r'Native \s*(\d+)'
dalvik = r'Dalvik \s*(\d+)'
m1 = re.search(native, output)
m2 = re.search(dalvik, output)
PSS = float(m.group(1))
NativeHeap = float(m1.group(1))
DalvikHeap = float(m2.group(1))
return PSS, NativeHeap, DalvikHeap def profile(self):
PSS, NativeHeap, DalvikHeap = self.getProcessMem() self.PSSList.append(round(PSS / 1024, 2))
self.NativeHeapList.append(round(NativeHeap / 1024, 2))
self.DalvikHeapList.append(round(DalvikHeap / 1024, 2)) return round(PSS / 1024, 2), round(NativeHeap / 1024, 2), round(DalvikHeap / 1024, 2)
[腾讯 TMQ][Android 场景化性能测试] UI 流畅度篇
https://testerhome.com/topics/10823
【android 端抓取 cpu,fps,men,wifi/gprs 流量等值】
https://testerhome.com/topics/9513
【两句命令搞定移动端 (iOS 和 Android) 真机并发自动化测试】
github地址:
并发框架
MacacaLibrary
设计思路可以看:
浅谈测试工程化-以并发自动化框架为例
Android 性能测试之内存 --- 追加腾讯性能案例,安卓抓取性能扫盲帖的更多相关文章
- Android登录client,验证码的获取,网页数据抓取与解析,HttpWatch基本使用
大家好,我是M1ko.在互联网时代的今天,假设一个App不接入互联网.那么这个App一定不会有长时间的生命周期,因此Android网络编程是每个Android开发人员必备的技能.博主是在校大学生,自学 ...
- LoadRuner性能测试之内存分析方法及步骤(Windows)
1.首先观察Available Mbytes(可用内存),至少要>=1/2的内存空间 2.然后观察Pages/sec值是不是很大 3.再观察Page Faules/sec是不是很大,其值表示 ...
- Shell脚本 | 性能测试之内存
性能测试中,内存是一个不可或缺的方面.比如说在跑 Monkey 的过程中,如何准确持续的获取到内存数据就显得尤为重要. 今天分享一个脚本,可以在给定时间内持续监控内存,最后输出成一份 CSV 文件,通 ...
- 性能测试之Windows常见性能计数器
性能计数器(counter)是描述服务器或操作系统性能的一些数据指标.计数器在性能测试中发挥着“监控和分析”的关键作用,尤其是在分析系统的可扩展性.进行性能瓶颈的定位时,对计数器的取值的分析非常关键. ...
- Android APP测试的日志文件抓取
1 log文件分类简介 实时打印的主要有:logcat main,logcat radio,logcat events,tcpdump,还有高通平台的还会有QXDM日志 状态信息的有: ...
- 【android】[转]Android软件测试的日志文件抓取简介
1 log文件分类简介 实时打印的主要有:logcat main,logcat radio,logcat events,tcpdump,还有高通平台的还会有QXDM日志 状态信息的有:adb s ...
- [原创]使用logcat快速抓取android崩溃日志
在android APP测试过程中会发生不少的crash,目前抓取日志的主流方法是通过eclipse或者eclipse的ddms组件进行捕抓,这两种方法有个缺点是启动时非常耗时.本文通过adb程序与b ...
- 使用新版Android Studio检测内存泄露和性能
内存泄露,是Android开发者最头疼的事.可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴. 怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的 ...
- 浅谈Android应用性能之内存
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...
随机推荐
- THML DOM / Element 对象操作
随着Vue等MVVM框架流行,操作DOM已经不想之前那么频繁,因此很多DOM的操作已经陌生,特此回顾HTML中DOM操作 获取Element节点 熟悉的有 通过ID获取,返回element对象 ...
- PHP中的 抽象类(abstract class)和 接口(interface)
抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 .抽 ...
- ABAP-折叠窗口
1.测试 2.代码 *&---------------------------------------------------------------------* *& Report ...
- void类型详解
void含义 void的字面意思是"无类型",void*则为"无类型指针",void*可以指向任何类型的数据. void几乎只有"注释"和限 ...
- shell命令中用source 和sh(或者bash)执行脚本的区别,以及export的作用
用户登录到Linux系统后,系统将启动一个用户shell,我们暂且称这个shell为shell父. 在这个shell父中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序. 当使用 ...
- 367. Valid Perfect Square
原题: 367. Valid Perfect Square 读题: 求一个整数是否为完全平方数,如1,4,9,16,……就是完全平方数,这题主要是运算效率问题 求解方法1:812ms class So ...
- JAVA 泛型的参数的传递示意图
泛型的两种参数传递方式
- 用adb取出在手机中安装的apk
第一步:列出所有安装的apk adb shell pm list packages 然后找到自己要取出来的apk的包名. 第二布:找到apk的位置(后面跟上包名) adb shell pm path ...
- Ajax 学习 第一篇
http请求: 1.请求的方法或动作 2.正在请求的url 3.请求头 4.请求体 及请求正文 典型例子 get.post区别 1.get 幂等 执行一次哪怕一万次影响相同 一般用于信息获取 ...
- 认识bash和shell
各个 shell 的功能都差不多, Linux 默认使用 bash ,所以我们主要学习bash的使用. 1.bash命令格式 命令 [-options] [参数],如:tar zxvf demo. ...