Macaca [基于 Node.js 的自动化测试-Macaca] - 获取 Android 应用的性能

xdf · July 01, 2016 · Last by willys replied at October 23, 2017 · 2953 hits

上一篇 - Macaca 如何实现多任务

前言

在测试流程中,我们通常会加入一些性能采集,例如网络、cpu、线程情况、内存等等,本文介绍下如何用最简单的方式,获取 Android 应用的一些性能参数。

原理很常规,使用 adb shell 配合即可,但是需要使用 Node.js 对 adb 命令封装一下。

怎么做?

接下来介绍 supern 写的 android-performance 模块如何使用。

将 引入项目即可,下面的代码来自 android-performance 的单元测试,用以说明如何一次性取到所有指标。

// file: /test/android-performance.test.js

it('should all in one with promise', function(done) {
const perf = new AndroidPerformance();
const p1 = new Promise((resolve, reject) => {
perf
.initDevice()
.then(() => perf.getMeminfoByPackageName(pkgName))
.then(res => {
resolve({
item: 'Meminfo',
data: res
});
});
});

const p2 = new Promise((resolve, reject) => {
perf
.initDevice()
.then(() => perf.getPid(pkgName))
.then(pid => {
return perf
.getThreadCountByPid(pid)
.then(d => {
resolve({
item: 'ThreadCount',
data: d
});
})
.catch(e => {
resolve(null);
});
})
.catch(e => {
resolve(null);
});
});

const p3 = new Promise((resolve, reject) => {
perf
.initDevice()
.then(() => perf.getPid(pkgName))
.then(pid => {
return perf
.getUidByPid(pid)
.then(uid => {
return perf
.getTrafficByUid(uid)
.then(d => {
resolve({
item: 'Traffic',
data: d
});
})
.catch(e => {
resolve(null);
});
})
.catch(e => {
resolve(null);
});
})
.catch(e => {
resolve(null);
});
});

const p4 = new Promise((resolve, reject) => {
perf
.initDevice()
.then(() => perf.getPid(pkgName))
.then(pid => {
return perf
.getCPUByPid(pid)
.then(d => {
resolve({
item: 'cpu',
data: d
});
})
.catch(e => {
resolve(null);
});
});
});

Promise.all([p1, p2, p3, p4]).then(result => {
console.log(`performance:${JSON.stringify(result)}`);
done();
});
});

可以得到如下结果:

如何加到用例里

const wd = require('macaca-wd');

const androidPerfPin = function() {
// ...
// 封装性能探针即可
};

// 加到调用链扩展里
wd.addPromiseChainMethod('androidPerfPin', androidPerfPin);

然后就可以使用熟悉的语法啦

it('xxxxxxxx', function() {
return driver
.elmentById('xxxxxxxxx')
.click()
.androidPerfPin()
.screenshot();
...
});

本篇介绍了如何采集 Android 性能,下篇准备介绍如何采集页面的性能。


欢迎讨论,互相学习。

微博: http://weibo.com/xudafeng
Github: https://github.com/xudafeng

下一篇 - Android 输入中文的实现

共收到 9 条回复 时间 点赞
xdf [Topic was deleted] 中提及了此贴 01 Jul 20:06

虽然说功能听完善的,Nodejs我也用了段时间,但总感觉拿它写测试用例,感觉怪怪的

xdf #3 · July 01, 2016 作者

#2楼 @codeskyblue 楼上应该喜欢Python吧,哈哈,欢迎私聊

你采数据是什么逻辑去采集呢?
我说的是 某一个操作你是操作前?还是操作中?操作后?或者全部取求平均??
appium自动化的时候去采集数据的时候,会偏高一点点,不知道你这种方式会不会?

xdf #5 · July 04, 2016 作者

#4楼 @testly 示例中提供的是操作后,什么时候采集是看自己需求自由控制的

#5楼 @xdf ok了解了

提醒注意下:dumpsys meminfo 和 dumpsys cpuinfo不要混用,dumpsys meminfo操作会引起cpu数据升高不准

xdf #8 · July 04, 2016 作者

#7楼 @sandman 多谢提醒,如果vm被触发gc会直接影响性能参数的,这里是个参考值,没有绝对准确的概念。没有混用

结合TencentGT http://gt.qq.com 是不是要好点,只是提个想法

xdf [Topic was deleted] 中提及了此贴 05 Jul 11:46
xdf [Topic was deleted] 中提及了此贴 08 Jul 17:13
xdf 关闭了讨论 12 Sep 16:02
xdf 重新开启了讨论 12 Sep 16:02

运行有错误:UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): exec dumpsys meminfo com.demo error with: TypeError: Cannot read property 'trim' of undefined

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up