Android自动化测试+性能监控预警系统搭建

1、自动化测试

首先,我们为什么要引入自动化测试?

我们把范围略微缩小点,放在移动端这个环境上,自动化测试是指在预设条件、路径下运行app,运行之后给出一个评估结果,通常会生成一份测试报告,有哪些用例通过,有哪些些用例没有通过。这一过程完全是自动的,几乎不需要认为干预的,这对于人力不足的团队来说,对于保证产品质量方面,是一个较好的选择。

其次,自动化测试框架有哪些,我们该如何选择?

首先,从Android,ios两个平台上来看,这两个系统本身就提供了各自的自动化测试框架,比如

当然,以上并没有,全部一一列举出来,不过,稍稍了解一下,我们就知道,以上提到的测试框架它们都限定了平台,说白了就是不支持跨平台,这样,就痛苦了,写测试用例还需要对两个平台来写,这样开发同学就不乐意了,学习成本略大。

那么,对于我们这群苦逼的开发,到底该如何选择呢?可以从以下两个方面考虑

1、跨平台性

  1. 明显是为了降低学习成本而来了[奸笑]

2、支持脚本录制

  1. 没接触过自动化测试的同学可能会一脸懵逼,可以录制是指指需要点一点,脚本就写好(录制好)啦,哈哈,明显是为了偷懒,不想写测试脚本。

嗯,基于上面两个需求点出发,我是如何做的选择呢?

我选择了appium作为自动化测试框架!为什么会选择它?

  1. 满足了我的需求
  2. 社区非常活跃,尝试够,遇到的问题,基本可以在社区上找到。
  3. 开源,而且github上star数杠杠的,且issue解决也是相当迅速的。

还有哪些类似的自动化测试框架值得关注?

据我了解,类似的这种测试框架还Macaca,是阿里维护的,也在github上开源,star数比appium要少很多,单功能貌似开起来还挺完备的。这点还是要对阿里的技术赞一个,不过,比较遗憾的是,由于精力有限,我并没有研究这个,但是它同样对我非常有吸引力。

更加匪夷所思的是,居然还有带自然语言处理的自动化测试框架Calabash

好的,自动化测试框架的选取就说明到这里,至于appium如何install,如何跑起来录制测试用例脚本,那又可以写一篇文章了,本文只想写一篇指导性的文章,因此这不打算在继续深入。

ps,install,录制脚本,我是直接参考的官网,并没有到社区去找其他文章,说明他的官网文档还算可以的。

嗯,下面一个环节是如何在自动化测试环境中搜集性能数据了。

2、性能数据收集

这里,我决定使用Android为例,来介绍一下,搜集app内存,帧率,cpu等信息的思路。android平台上,adb shell dumpsys 命名提供了我们所需要的所有信息,如

内存方面

adb shell dumpsys meminfo packagename

那么,问题来了,我们如何提取里面的字段,比如Java Heap,Native Heap,Total等呢?我采取的是使用python对文本分析,具体代码如下:

# dump 内存信息
    @staticmethod
    def dump_current_mem_info():
        orgin_lines = os.popen("adb shell dumpsys meminfo xxx.xxx.xxx").readlines()
        app_summary = "App Summary"
        java_heap = "Java Heap:"
        native_heap = "Native Heap:"
        total = "TOTAL"
        index = 0;
        for line in orgin_lines:
            if re.findall(app_summary, line):  # 找到appSummary 这一行,取下面的15行
                break
            else:
                index = index + 1;
        lines = orgin_lines[index:index + 15]
        for line in lines:
            if re.findall(java_heap, line):  # 找到TOTAL 这一行
                lis = line.split(" ")  # 将这一行,按空格分割成一个list
                while '' in lis:  # 将list中的空元素删除
                    lis.remove('')
                java_heap = lis[2].replace("\n", "")
            if re.findall(native_heap, line):
                lis = line.split(" ")
                while '' in lis:
                    lis.remove('')
                native_heap = lis[2].replace("\n", "")
            if re.findall(total, line):
                lis = line.split(" ")
                while '' in lis:
                    lis.remove('')
                total = lis[1].replace("\n", "")
        print([java_heap, native_heap, total])
        return [java_heap, native_heap, total]
        pass

帧率等信息

adb shell dumpsys gfxinfo packagename

同样的道理,使用python脚本分析,可以轻易拿到你想拿的性能数据。

cpu相关信息

adb shell dumpsys cpuinfo |grep xxx.xxx.xxxx

可以拿到当前app占用cpu数据。

ok,性能数据都搜集到了之后,接下来的事情是要将这些搜集到的性能数据放到某个地方了

3、数据上报

对于数据上报这块,无非就是调用某接口将数据写入到文件,或者数据库(其实也是文件,只不过是有模式的文件),那么到底已那种方式写入呢,我倾向于写数据库,因为,数据库记录的文件查询起来比较方便,可以很简单的做一些条件查询,不过两种方式都没有什么问题,主要看那种方便了,结合后面数据的程序,我选择了使用MongoDB存储我搜集到的性能数据。

ps,MongoDB我并没有学习,而是参考官方教程直接开搞,主要也是得益于官方文档写的比较好,下面是我定义的数据模式,也就是我要上报的字段。

var PerformanceSchema = new Schema({
  platform: {
    type: String,
    default: 'Android'
  },
  environment: {
    type: String,
    default: ''
  },
  test_case: {
    type: String,
    default: ''
  },
  java_heap: {
    type: Number,
    default: 0
  },
  native_heap: {
    type: Number,
    default: 0
  },
  total_memory: {
    type: Number,
    default: 0
  },
  cpu: {
    type: Number,
    default: 0
  },
  total_frames: {
    type: Number,
    default: 0
  },
  jank_frames: {
    type: Number,
    default: 0
  },
  frame_50_percentile: {
    type: Number,
    default: 0
  },
  frame_90_percentile: {
    type: Number,
    default: 0
  },
  number_missed_vsync: {
    type: Number,
    default: 0
  },
  // status: {
  //   type: [{
  //     type: String,
  //     enum: ['pending', 'ongoing', 'completed']
  //   }],
  //   default: ['pending']
  // },
  ctime: {
    type: Date,
    default: Date.now
  }
})

好了,数据库表建立ok之后,如何将数据发送给MongoDB保存呢?这时候,我考虑使用restful接口将数据post过去。

于是,我在Google上搜索了 node restful,

很快,我遍用express构建好了搭建了一个restful框架,简单的配置好路由之后,如下:

我就可以通过http://localhost:3000/performances 来post我搜集的性能数据到MongoDB了。

数据发送到MongoDB之后,接下来要做的事情当然就是呈现出数据,让我们直观的了解app性能数据的一个趋势了。

4、数据呈现

数据的呈现一般来说,会涉及到图表的展示,我这里使用的chart.js 。然后css这块的话,我也不准备自己来手写,直接使用了一css框架bootstrap

最后做出来的效果是:

5、监控告警

对于告警这块,就比较愉快了,配置一些性能参数的阈值,达到这个阈值,就出发告警条件,可以对关注着发送邮件报告,或者短信通知了,比如,在跑测试用例的过程中,捕捉到的一条性能数据出现,cpu消耗过高,超过了20%率用率,说明这块可能存在复杂的计算逻辑,看看能否优化优化了。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏路由技术

路由交换OSPF域内路由

OSPF路由器R1的LSDB同步完毕后,需要独立计算去往每个网段的最优路径 R1的Router ID 1.1.1.1 每台OSPF路由器都会为每个区域生成唯一一...

23200
来自专栏大数据文摘

业界 | 如何像程序员一样思考

即使你的运气一向很好,这种方法也并不值得使用。事实上,它可能是最糟糕的解决方法,因为会浪费大量的时间。

10910
来自专栏服务端技术杂谈

去解决更多的问题,而不是如何最好地解决一个问题

有些人非常勤奋,别人休息和娱乐的时候,都在工作学习。但是努力了一辈子,人生也没有显著的提升,就像报道里经常说的:"某某在平凡的岗位上,勤勤恳恳工作了一辈子"。

13640
来自专栏阮一峰的网络日志

约翰·霍普金斯医学院的声明

14520
来自专栏阮一峰的网络日志

带字幕的Youtube

现在有人就制作了一个网站YouTube Subtitle Editor,专门为Youtube加字幕。你可以先看一段动画片《蜘蛛人》的主题歌,体验一下效果。

50020
来自专栏凌帅的阅读思考与实践

【投资中的那些坑】开栏语

很多人在投资中喜欢财聚人聚,财散人散,总往有钱的地方钻营。就象游牧民族,哪里水草肥美,就到哪里去。一旦情况不好,就会迅速退场。只能同甘,不能共苦。

14730
来自专栏云计算D1net

将应用程序移动到云端?确保良好客户体验的3个步骤

如今,许多企业正在将面向客户的网站和应用程序迁移到云端。云计算使企业能够降低基础设施成本,并将更多时间用于创收和业务增长。但采用云计算如何在确保提供高质量的用户...

28340
来自专栏阮一峰的网络日志

排版六原则

几天后,就收到了秋叶老师的来信,希望与我探讨一些设计问题。他写过一本畅销书《说服力-让你的PPT会说话》,眼下正在写续集。

12220
来自专栏前端侠2.0

td在relative模式下,IE9不显示border,chrome正常显示边框

百度上怎么也搜不出答案,很奇怪的问题。在IE9的 F12调试中,明明td有1个像素的边框,偏偏不显示。

15310
来自专栏老九学堂

揭秘!程序员为什么会一直加班加班...

15120

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励