性能自动化充电、断电之痛​——小松鼠的救赎之路

起因

去年刚来公司,我便接手了腾讯LB这款App的性能测试工作。

当时的性能测试的需求是,采集腾讯LB在“前台导航”“后台导航”等数个场景下的电流值、cpu、内存、流量等数据。而当时的采集手段是:使用GT(一款优秀的性能测试的组件,插件中支持了GPS轨迹回放的功能,更多可以参考GT的官网 http://gt.qq.com/)回放一段固定的GPS轨迹,然后发起导航后使用GT来采集数据。

具体过程如下:

从上图可见,整个过程中需要人工干预,其中设置GT操作App是一个重复、繁琐的过程。并且为了保证测试的环境一致,减少误差,需要保证每次电池的电量是一致的(尤其在电流的采集中),但是充电过程比较耗费时间,并且需要人监测,浪费了不少精力。在和项目比较紧张的时候,人力都投入到了项目上,导致性能测试只能在项目完成后再进行测试,每次的结果都是比项目上线要滞后一步。

  于是针对以上痛点,我们经过调研和思考决定采取以下方法来解决目前的现状问题:

  1、充电:使用继电器来完成自动充、放电;

  2、设置GT:手工操作GT的方式,用程序调用GT的SDk来驱动(后来GT支持了广播方式驱动,也可以用广播);

  3、操作App:使用谷歌提供的uiautomator来进行UI自动化。


初探

  有了上述的解决思路后,我便开始一步步的去落实每一项任务。我的想法是用一个Android的应用程序(小松鼠的雏形)来总体控制这所有的事情。我们接下来看看这每一步和小松鼠都是怎么联系起来的。

自动充电

  从一位有硬件经验的同事那里了解到,继电器可以做到这个,但是对于不懂硬件的我,究竟怎么去弄懂这玩意呢?这期间花费了我很多的精力:咨询淘宝卖家、查阅资料、请教前辈。最终终于搞清楚了这个小玩意的用法。

  而最终指定的解决方案是:将usb数据线的电源线,接在继电器的两端来控制usb数据线的开和断。听到这里是不是有点迷糊了?没事往下看,我会慢慢的解释。

继电器

PL2303,是一个usb转串口的单独继电器模块,淘宝搜索有很多卖的。它就是用来控制线路的通和断

USB数据线

    用了这么久的usb数据线,估计今天你们才知道它的内部结构吧。各个线的含义:USB电源线(红线)、数据线负(白线)、数据线正(绿线)、地线(黑线)。

连接方式

  1、将USB数据线的电源线(红线)拦腰剪断,去除外部的绝缘层,让金属丝出来

  2、将电源线两头裸露出来的金属丝固定在继电器的后面两个接触点上,如图所示:

    当年为了做这个东西,不知道残害了多少数据线宝贵的生命,曾一度可怜到没数据线用,至今的充电线还是当年被我破坏后,又进行手术挽救回来的生命。

使用方法

    使用的时候只需将继电器插在pc的usb口上,然后pc端向串口发送数据,即可控制继电器的开和断,从而决定手机是充电还是断电。

    控制继电器的pc端程序,我用c++实现了一个“TencentRelay”的程序,两种方式调用:

    1、界面调用:

    直接填写好当前继电器占用的串口号,模块地址默认为1,然后点击连接串口;连接成功后,点击”吸合”打开继电器,点击“断开”断开继电器;

    2、命令行调用:

    调用命令 ”TencentRelay.exe 3 1 open“ 打开继电器;

    调用命令 ”TencentRelay.exe 3 1 close“ 关闭继电器;

    其中参数二为串口号,参数三为模块地址默认为1,参数四为操作命令,只接受open和close; 

  当继电器打开(吸合)后,继电器硬件的红色指示灯点亮,此时可以模拟充电,相反当继电器断开的时候,红色指示灯熄灭,此时处在断电的状态。

小松鼠如何控制

    PC端我用python写了一个简单的服务器,并且用全民wifi搭建出的一个热点,手机的wifi连接到这个热点之后,它们便处于同一局域网中了。小松鼠App注册了一个电量变化的广播接收器(BroadcastReceiver)来随时接受电池电量的百分比,当手机在充电的时候,如果电量达到了预期值,则会通过UDP协议与PC端的服务器进行通信,服务器收到消息后,便会调用TencentRelay.exe来控制关闭继电器,开始性能测试。

设置GT

GT做为一款优秀的性能测试工具,其功能非常强大,并且支持了SDK的调用和广播方式的调用(后来才完善的),因此初期的时候,我在小松鼠内部引入了GT的jar包,通过调用SDk来实现gps轨迹的回放,开始采集性能数据,结束采集性能数据,保存文件等。调用GT sdk来控制采集性能数据的API,我们都可以在GT官网查到。

操作App

  之所以选取uiautomator,两个原因:

  1、可以脱机运行:只需将jar包push到手机中,然后在小松鼠中使用Runtime运行一句命令即可。而这个需求Appium是无法满足我的。

  2、跨进程:一方面可以在没有源码的技术上,进行UI自动化,这个主要用在竞品对比中;另一方面提升UI自动化的稳定性,举一个很简单的例子:有一次我的自动化执行过程中失败了,原因是找不到控件,我会在出错的时候截图,当时记录下的场景是刚好有人在给我的测试机打电话,于是我在我的脚本中增加了这么一条,如果在找不到控件的时候去判断是否有电话来了,如果是,就去挂掉它。所以Robotium也不是我的菜。

  每次的流程是:小松鼠调用GT sdk开启性能采集 --> 小松鼠通过Runtime 调用 “uiautomator” 命令开始模拟App操作 --> 小松鼠调用GT sdk停止性能采集

  在小松鼠的代码中,我们直接使用runtime在命令行下调用uiautomator的命令,这样的调用方式是一个同步的过程,因此uiautomator的执行时间就决定了性能采集的时长,因此在写脚本的时候,发起导航后,需要sleep的时间就是到达目的地的时间。


小有成果

简介 

  做完上述的所有工作之后,小松鼠第一代诞生了:

  先简单介绍这个工具的各个控件的含义吧:

参数设置

  预期电量值:当你设置之后,只有当前手机电量的百分比大于等于这个值后,App才会给PC发消息关掉继电器,然后进行后面的流程;

  服务器IP:电脑上共享来的无线网卡的ip地址;

  测试用网络:uiautomator开始运行时使用wifi还是3G网络;

  性能测试项:勾选哪些项,调用GT采集数据时,就采集哪些项;

  执行场景:勾选哪一项,就会执行对应的uiautomator脚本;

  GT保存路径:采集完成之后,性能数据保存的文件夹名称

当前状态

  这一栏当时在做的过程中主要是调试用的。

  wifi状态代表当前wifi是打开还是关闭;电量状态代表的是当前手机电池电量的百分比。

log

  当出现错误时,可以初步定为问题,因此保留log在主界面。

操作

  当配置栏设置好之后,点击开始即触发了任务。结束会停止任务。

使用步骤

  知道了App的参数含义后,相信大家已经基本会用了吧。每一次的性能测试,我们都可以通过这样的方式来进行:

  1、 将继电器插在PC端,并且使继电器处于吸合(打开)状态,将搭载继电器USB线两端分别连接电源和手机,使手机处于充电状态;

  2、 给手机安装APPTestBattery,启动APP之前,关闭GT和App;

  3、 配置好局域网,填好局域网内IP地址,将PC端服务器打开;

  4、 打开手机端APP,设置预期电量值、服务器IP地址、性能测试项、测试场景、日志存放文件夹名称等一系列参数,设置完毕后,点击开始按钮;

  5、此时APP处于检测状态,当手机实际电量大于等于填写的预期电量值时,就会触发关闭继电器,开始性能测试,性能测试的整个过程中,GT实时地采集性能数据,待一个场景测试结束后,手机自动连接WIFI给PC端服务器发消息;

  6、 PC端收到数据后就会打开继电器,再次进入充电状态;

  7、 这样一轮测试就结束了,本次保存的性能测试数据存放在手机中的GT目录下;

不足

  很显然这个方案相比较之前的方案,已经省去了很多的人力,每一次的测试都需要提前准备好继电器,并且配置好App,点击开始即可进行了。但是仍然有可以改进的地方:

  1、UI不美观:

  虽然这是一个自己使用的App,但是它也有一颗登上大舞台的心,梦想还是要有的,万一实现了呢?因此有一套美观的UI也是一个像样点App最基本的要求;

  2、配置缺陷:

  不知道有没有人发现,每次测试的时候都需要配置一次,并且每次只能测试一个场景,如果要是一次能配置多个场景,让它一个接一个的执行,这样则更加方便了;

  3、无法测试其他App:

  在 “执行场景” 这个地方,uiautomator脚本和对应的场景是在Android代码里写死了,如果要运行其他程序,则需要改源码。

  4、结果处理:

  目前在一轮性能测试结束后,采集的性能数据结果存放在手机上GT的目录下,不方便即时的查看,不能做到数据的实时展示。


浴火重生

针对小松鼠第一版的不足,我决定大改一次,,即使它已经服役了好几个版本的腾讯LB性能测试的采集工作。

  再经历了两个月后,新版的小松鼠出炉了~

你可以看到除了UI上有了很大的进步(做为一个写代码的,ui做成这样,我觉得已经可以了),功能变的更加的强大,解决了第一版的所有缺陷,当然功能越强大带来的问题就是操作性上可能更繁琐了。这里的操作可能更多的就是配置了,因此为了解决这个问题,我在配置这一块支持了外部配置,即使用一个xml的配置文件即可完成配置。

XML配置文件中,我们可以配置被测应用、服务器地址、以及多个测试任务,每个测试又包含是否使用继电器,是否设置屏幕亮度,亮度调节到多少?回放哪个GPS轨迹,采集哪个性能指标项,使用的uiautomator命令等等很多信息,单从配置就可以看出我们支持了更多的东西:

1、每次测试的手机环境,除了保证电量的一致性,还可以设置手机的音量大小和屏幕亮度,后台灭屏场景的测试可以设置是否打开wakelock锁。

2、测试回放的场景的脚本,支持为了可配置,当然为了方便,我把经常用的直接编译到了我的app中,这样好多固化的场景就可以直接选择了。

  选取了对应的场景之后,uiautomator脚本的运行命令就帮我自动的填写在了这个地方。

  当然你可以自己编辑运行命令,或者是在xml中进行配置。

  现在每天我都会用最新的提测包,去测试一组性能数据。我的配置文件是固定,存在手机sd卡的根目录下。如果每次需要修改,直接修改xml即可。当手机中有了配置文件之后,小松鼠会自动读取这些测试场景:

  这个时候,只需点击 “开始” 即可。

  因为每次测完一个场景之后,都会进行“智能充电” 的过程,因此我的这些脚本一般能运行一晚上的时间,我只需要第二天来了之后,处理数据即可。我们看看现场的环境:  

  来张近照

  前面提到,我的PC的服务器,它除了可以接受小松鼠发来的控制继电器的命令外,还可以接受每次性能数据采集完成之后的发来的性能数据压缩包。

  接受到这些压缩包后,服务器端的脚本程序可以对这些压缩包中的数据进行处理,得到每一项指标的数据,

  得到这些数据之后,将这些数据整理,传到我们组的 “八爪鱼”(一个用来展示数据结果的内部web平台)来进行结果展示:

  目前数据是将当前版本和之前版本的数据进行对比,每个场景的多项指标数据,可以通过滚动来查看。

  到此,小松鼠“一键开始性能测试,到最终所有结果上传到web端进行展示”的全部过程就介绍完毕。

  整个过程中踩了不少坑,但是也积累了很多宝贵的经验,如果你有更好的想法,同时对性能数据的采集也感兴趣,那么请联系我,我们可以一起交流。

未来

就目前而言,性能采集的部分相对其他工具算是比较完善了,但是性能之所以做为项目组关注的重点,其分析、定位问题是很重要的,目前这一块,我们还没有深入的进行。因此后面的计划,就是如何采集出更加精确的数据,并且进行更加精准的分析,然后在web的每日监控中发现问题,快速的定位问题。期待小松鼠的未来...

小博

作者简介:小博,曾担任搜狐畅游白盒测试工程师,现任职于腾讯,主要从事终端测试工作,文艺青年一枚,欢迎阅读原文留言和作者进行进一步交流。

原文发布于微信公众号 - 腾讯移动品质中心TMQ(gh_2052d3e8c27d)

原文发表时间:2016-03-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构师学习

数据库高可用实战案例:架构优化背景前期调研详细调研测试过程实施过程细节问题处理

25060
来自专栏开源优测

移动测试 | CheckList

移动测试CheckList 概述 在正式开始分享Appium前,先来一篇关于移动测试CheckList以便大家了解下移动测试要测试什么。 功能测试 功能测试对于...

39380
来自专栏私有云搭建

腾讯云服务器+可道云kodexplorer打造企业私有云

公有云越来越疲软,企业用户和个人用户对于公有云的接受度也越来越低。企业用户往往转向私有云盘产品,个人用户往往转向了NAS产品,从而来满足自己对于文件共享和管理的...

1.4K50
来自专栏跨界架构师

分布式系统关注点——「负载均衡」到底该如何实施?

        前面两篇《分布式系统关注点——初识「高可用」》、《分布式系统关注点——仅需这一篇,吃透「负载均衡」妥妥的》看完后,相信大家对实现高可用的思路和负...

14440
来自专栏令仔很忙

新手学Linux(二)----使用 Vagrant 打造跨平台开发环境(一)

做Web开发少不了要在本地搭建好开发环境,虽然说目前各种脚本都有对应的Windows版,甚至是一键安装包,但很多时候和Windows环境的相性并不是那么好,各...

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

理解Linux系统负荷

一、查看系统负荷 如果你的电脑很慢,你或许想查看一下,它的工作量是否太大了。 在Linux系统中,我们一般使用uptime命令查看(w命令和top命令也行)。(...

34940
来自专栏Java帮帮-微信公众号-技术文章全总结

【大牛经验】千万级并发实现的秘密

千万级并发实现的秘密 先解释一下什么是10k问题: 什么是 10K 问题? 在 1999 年,Dan Kegel 向网络服务器提出了一个骇人听闻的难题: 是时候...

57750
来自专栏分享达人秀

Android开发环境概述

工欲善其事,必先利其器。Android开发人员在自己的计算机上编写和测试应用程序,然后将其部署到实际的设备上,那首先必不可少的就是开发环境的搭建。 ...

39450
来自专栏携程技术中心

干货 | 携程图片服务架构

24060
来自专栏嵌入式程序猿

我怼了硬件工程师,让你不按datasheet设计

最近有个项目是使用NXP的KEAZ64芯片,基于cortex M0+内核。带有mscan模块,mscan是NXP的8位机和低端32位上用的CAN模块外设,和我们...

40770

扫码关注云+社区

领取腾讯云代金券