专栏首页玩转全栈Android自动化测试+性能监控预警系统搭建
原创

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 条评论
登录 后参与评论

相关文章

  • 掌握我说的这些,vue还只能算入门

    闲的蛋疼,突然想做点h5开发了,对比了一下react和vue,果断选择了vue作为学习框架,一来是因为之前做小程序,比较熟悉vue这套模式,二来因为vue的的确...

    brzhang
  • flutter实现一个sideBar

    用flutter中实现这么一个sidebar,期初我想了5中方式,但是最后,发现只有一种可以实现,那么是哪5种方式呢?

    brzhang
  • 码农也该懂点sketch

    sketch是一款轻量的,易用的矢量设计工具,有了它,可以让你进行更加简单高效的UI设计。

    brzhang
  • 【JS】125-重温基础:数字

    前置基础: 在JavaScript中,数字为双精度浮点类型(即一个数字范围只能在-(253-1)和(253-1)之间),整数类型也一样。 另外数字类型也可以是以...

    pingan8787
  • JS原生引用类型解析5-Number类型

    (注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

    love丁酥酥
  • 当JavaScript遇上UINT64

    导语:写下这篇文章的缘由是因为在项目过程中,碰到了一个使用JavaScript处理 UINT64 类型数字的坑。 与大部分现代编程语言(包括几乎所有的脚本语言...

    IMWeb前端团队
  • 当JavaScript遇上UINT64

    与大部分现代编程语言(包括几乎所有的脚本语言)一样,JavaScript中的数字类型是基于 IEEE 754 标准来实现的,该标准通常也被称为“浮点数”。Jav...

    IMWeb前端团队
  • 机器翻译之BLEU值

    BLEU(Bilingual Evaluation Understudy),相信大家对这个评价指标的概念已经很熟悉,随便百度谷歌就有相关介绍。原论文为BLEU:...

    种花家的奋斗兔
  • 手把手教你使用Pygame制作飞机大战小游戏,4万字超详细讲解!

    大家好,偷学Python系列是由小甜同学从初学者的角度学习Python的笔记,其特点就是全文大多由新手易理解的代码与注释及动态演示。刚入门的读者千万不要错过!

    刘早起
  • 推荐网盘使用OneDrive For Business

    再就是,共同编写PPT,用office!用office!用office!再也不要“大家做完发给我合一下”“他为什么不改字体”“他做得这么丑,为什么不看看我做的”...

    Sidchen

扫码关注云+社区

领取腾讯云代金券