上一篇 - 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 输入中文的实现


↙↙↙阅读原文可查看相关链接,并与作者交流