前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android自动化测试+性能监控预警系统搭建

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

原创
作者头像
brzhang
修改2018-10-18 11:07:07
3.1K0
修改2018-10-18 11:07:07
举报
文章被收录于专栏:玩转全栈玩转全栈

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对文本分析,具体代码如下:

代码语言:javascript
复制
# 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我并没有学习,而是参考官方教程直接开搞,主要也是得益于官方文档写的比较好,下面是我定义的数据模式,也就是我要上报的字段。

代码语言:javascript
复制
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%率用率,说明这块可能存在复杂的计算逻辑,看看能否优化优化了。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、自动化测试
  • 2、性能数据收集
  • 3、数据上报
  • 4、数据呈现
  • 5、监控告警
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档