硬件测试的思考和改进:有道词典笔的高效测试探索引言
作者/ 刘哲; 编辑/ Ryan ; 来源/ 有道技术团队(ID: youdaotech)
当我们提到智能硬件的高效测试时,通常会考虑使用自动化测试的方案,提升产品的测试效率和质量。
由于智能硬件的使用过程中,包括了大量和用户的行为交互,这就导致在测试方案上,传统的软件自动化测试很难完全模拟用户的完整使用行为。
因此,我们除了要考虑借鉴和使用软件测试的思路之外,还要考虑如何实现硬件测试自动化。
一、背景
有道词典笔 2.0 是网易有道自研的学习型智能硬件。
有道词典笔搭载了有道自研的 OCR、NMT、TTS 技术,为用户提供了一扫查词、中英文互译、语音助手、触屏、离线等功能。
当我们拿到词典笔 2.0 第一个版本的时候,首先看到的是它的硬件外观:
![](https://img-blog.csdnimg.cn/img_convert/e2b28d1b043e0796f0116a9abb12d9f1.png)
从硬件层面来看——
它包括了一块可触摸的屏幕,接口方面使用了 Type-C 方案,在下方有一个摄像头,背面有喇叭可以发音,按键方面有开关机、功能键和笔的触头。
同时在设备的内部还内置蓝牙和无线模块。
这个产品如何使用呢?这里通过一个视频来展示下用户的使用场景。
![](https://img-blog.csdnimg.cn/img_convert/e0417e4127cd40203e70fd7319cd8963.gif)
我们可以看到,用户的典型使用场景是:
手持有道词典笔,向下按压笔头开启补光灯和摄像头,在文字上方滑动,实现对文字的拍照。之后图片合成,进入 OCR 模型,识别出文字后,进入 NMT 模型,最后翻译结果展示出来,进入 TTS 服务。
所以,简单来说,它是以扫描识别行为为基础操作,实现若干功能的一款硬件产品。
现在我们知道软件方面的能力了,这时候就可以结合硬件一起来考虑,有道词典笔的高效测试要怎么做。
二、让硬件动起来
我们对一款产品做自动化测试,首先要找到用户的主要使用路径。
用户花了最多的时间使用的行为,就是我们需要花精力去考虑如何模拟的行为。
很明显,在这里用户的扫描行为引发的查词和翻译学习结果。
那我们就来看看,用户的实际操作是如何的。
我们对用户扫描的场景模拟,可以分成两个部分。
一个部分是对词典笔的控制,稳定的握持,另外一部分是对笔的移动。
![](https://img-blog.csdnimg.cn/img_convert/1f9f6a90f7dc63b54f44de3c5488e559.gif)
在考虑实现这样的方案时,我们考虑过市面上现有的自动化方案,来实现对笔的固定和移动。
但是碍于成本和可复制性并不合适,所以没有采用。
让词典笔从左向右移动起来这件事情,是整个行为的难点。
那是否可以让词典笔不动,也实现一样的扫描效果呢?
我们决定换个思路。
我们让笔不动,文字从右向左移动,从而模拟笔从左向右移动的效果。
![](https://img-blog.csdnimg.cn/img_convert/3e6e797fdb4a1cde21bf2d7c8b3ec94f.gif)
为了可以持续的测试,还需要文字再从左向右回来,然后再次从右向左。
当它成为一个循环的时候,就实现了持续的文字移动。
大家看这样运动的文字像是什么?
我们的第一反应就是传送带,就是工厂里见到的流水线上的移动,所以我们做了第一套方案。
我们把文字固定在传送带上,然后用电机驱动传送带,实现了文字的持续移动。
当文字可以稳定移动之后,我们通过 shell 去控制词典笔的扫描行为,包括了开关笔头灯、开关扫描行为等等。
然后我们可以把设定时间内的扫描内容传送到笔内的翻译引擎中,进入后续的翻译和发音流程。
![](https://img-blog.csdnimg.cn/img_convert/2b8c9a637206d05699c3963fa7f58d32.png)
文字动起来了,那让词典笔固定就相对容易一些。
我们做的第一个尝试是使用市面上已经有的支架,把词典笔固定在支架上方,大家可以看下视频。
可以把笔夹住,直接固定在传送带上。
![](https://img-blog.csdnimg.cn/img_convert/b79c3aa3c2e560a043c45fb853d4e127.gif)
但是我们也发现了一个问题,支架每次只能固定一只笔,而且稳定性并不佳,这个效果只能说是能用。
而且我们刚才也提到了,在测试的过程当中,通常是需要让多支笔固定的。
所以我们尝试自己做了一个支架,把N支笔固定在传送带上方,这样,我们就可以实现用户扫描行为的完整模拟了。
![](https://img-blog.csdnimg.cn/img_convert/dfa067b1fc5aa4d3d1e2ac4e0fc72758.gif)
这是我们对词典笔高效测试的第一次尝试,就是让硬件动了起来。
三、让方案更稳定
接下来我们要解决的问题是,让方案更稳定。
为什么有这样的需求呢?
在很长一段时间,我们都在使用上面提到的方案。
我们通过这套方案实现了功能稳定性的测试,对功耗以及电池曲线等都做了上百次的验证。
但是随着我们测试版本的增加,我们迭代的加快,自动化测试的需求更加频繁了。
在使用过程中,我们看到影响文字移动的稳定性,也就是传送带的稳定性因素是挺多的。
比如说电机老化,传动轴稳定性了,组装的精密程度,都可能会造成它文字转动时快时慢,甚至有的时候会停下来。
另外我们的前期一次可以去测试6支笔,但是到了后期,我们的测试版本的增加同时要测试的笔可能接近20支。
这个方案的改进就提上了日程。
我们还是分成文字的移动,以及笔的支撑两个部分来改进。
文字在垂直往复运动,这个方案我们使用的是传送带。
如果文字在水平方向往复运动呢?
我们观察了生活中很多的物品,最后发现小朋友喜欢的钓鱼玩具是一个不错的选择。
就是这个。
![](https://img-blog.csdnimg.cn/img_convert/1aa35027d6f91ba1e61645fc83c02736.gif)
首先它的转速是恒定的,它在设计决定了影响它速度的因素,只是电机本身。
另外它的性价比比较高,这就使得我们可以快速的复制和扩充测试能力。
如果我们把文字在转盘边缘排列,然后允许运动,是不是就可以形成类似移动的效果呢?
为此,我们在文案上进行了一定的设计和改进。
![](https://img-blog.csdnimg.cn/img_convert/ad718297b330ff47799cf968e3eaedc4.png)
我们把文字做了弧形的排版,固定在转盘上,在转盘的边缘固定测试笔,继续使用之前的自动化脚本。
这样就实现了用转盘的方案来实现扫描的行为模拟。
![](https://img-blog.csdnimg.cn/img_convert/9802760c4571f5835af545a4cb11597e.gif)
虽然它整体是个弧形的样子,但是得益于词典笔的算法优化,我们实际的拼图效果还是比较优秀的,对于测试测试没有什么影响。
最后我们去改装了它的供电方式为电源供电,这样它就可以长时间的做一个测试了。
所以到这个时候我们的文字移动方案稳定和可扩充性就已经有了比较明显的改进。
接下来我们要解决的就是词典笔的支撑改进。
我们看第一个视频,最开始是用硬纸来制作的简易的支架。
这依旧是个扩展性不佳的方案。
随着我们的后期的调整和改进,我们在设计的同时帮助下,做了一个支架的改良版,通过建模和 3D 打印的方式就把它生产出来了。
这样的话它足够精密,同时它支撑10支笔的测试,而且他可以快速的复制,扩充给其他需要测试的场所。
![](https://img-blog.csdnimg.cn/img_convert/1170adb72925843102ede11a54631846.gif)
这是我们实际 3D 打印出来之后的产品:
![](https://img-blog.csdnimg.cn/img_convert/27688415c92318a705ec1218948bca08.png)
这就是我们在目前测试使用的方案,到这里我们看到整体硬件自动化已经比较稳定了。
四、让控制可远程
现在我们要考虑的事情,就是让控制可以远程。
我们在硬件测试上做的方案,原本都是在公司进行的,测试的设备也都是 QA 内部团队在用。
但是今年年初的疫情改变了我们的工作方式,在很长一段时间里我们都是在远程办公。
为了方便让开发人员更方便去调试,也为了让方便异地工作的同事们可以随时的进行测试,还有就是希望我们的测试方案的可控性更强,我们开始在做一些可控性方面的探索。
整体来说让控制可以远程这件事,我们分成了5个目标。
![](https://img-blog.csdnimg.cn/img_convert/82d4dabdf0332e674d9f756801fe9a15.png)
首先,是我们的测试脚本可以远程开启和关闭。
第二,是我们需要能够控制硬件的开关,主要是转盘的开关和供电系统的控制。
比如在静止的时候就可以开启转盘,测完之后就可以关闭转盘。测试功耗之前给词典笔充电,测试开始要断开供电。
第三,是需要满足开发人员在家进行远程调试的这样一个需求。
在家办公的时候,我们和开发不是同一个网络,甚至不是同一个城市,那开发如何快速进入词典笔内部进行调试呢?
第四,我们希望整个测试过程是可以被看到的,我们可以通过视频的监控来确定它的测试状态。
最后,由于测试自动化完成了大多数的项目后,我们需要对测试过程中的数据进行跟踪,测试过程中的数据保存与展示也不可获取。
所以基于这5个目标,我们设计了下面这套测试框架。
大家可以看到整个系统架构如下。
![](https://img-blog.csdnimg.cn/img_convert/e04f881b1108316636271d0fcf3d5ff4.png)
首先我们引入了一个主机或者叫控制系统,这里是用树莓派 4b 来做的。
在树莓派上我们连接了一个摄像机,采用了 mjpg-streamer 的方案,开了一个 web 的监控服务,这样测试人员可以随时去观察我们的词典测试的运行情况。
然后在树莓派的 GPIO 上,连了一个 L298n 的一个芯片,通过 python 我们可以使用芯片对电机开关和速度进进行控制。
之后我们又连接了一套继电器,用来对词典笔的通断电进行控制。
为了实现内网转发穿透的能力,我们搭建了一个 ngrok 服务,然后在测验词典笔启动它里面去,这样就可以从任何位置 ssh 到词典笔内部。
为了方便我们去观察数据和判断结果,我们使用了 influxdb 来保存测试中产生的数据,使用 grafana 来展示结果。
![](https://img-blog.csdnimg.cn/img_convert/bd49a3d8233d7dfafcde24d03d55b8f3.png)
所以有了这样一套服务之后,开发产品和测试都可以实时的去用它。
这里我们有一个简单的演示视频。
我们外网通过 ngrok 服务远程,开启测试服务,然后开启转盘运转,这时测试开始。
测试中的视频就是通过树莓派的摄像头传输回来的。
当测试结束后,通过同样的方式,我们可以关闭或者继续进行其他的测试。
![](https://img-blog.csdnimg.cn/img_convert/cbc6106a997c52d3b80f577e5c60c38a.gif)
我们做了第三部分,让控制可以远程之后,我们基本上实现了一套框架。这套框架把我们用户最核心的操作,也就是扫描,变得可以自动化,可以远程控制,它可以稳定的远程控制。
五、让功能自动化
最后我们我们再来说说功能自动化的事情。
为了提升部分测试用例的自动化程度,我们还尝试做了一件事情,就是让功能自动化。
因为我们的产品是基于 Linux加QT 的架构实现的,为了提升它的测试效率,我们希望可以把核心软件功能自动化。
但是经过调研,市面上目前并没有足够成熟稳定的自动化测试方案适合我们。
我们通常说的自动化,大概的流程是先做控件的识别、再对控件做操作,然后对控件做校验。
在没有比较好的方案的前提下,我们用了一个“曲线救国”的自动化方案。
有道智云提供的 OCR 服务,可以针对图片上的文字进行识别。
它可以提取图片上的文字,并给出对应的坐标。
所以我们做的是:
01
用截屏加有道智云的 OCR 识别功能,实现了对文字的定位,代替了对控件的识别,例如“查词”,给出是否存在以及坐标位置。
02
用系统的操作,针对上面定位的坐标去点击、滑动等,实现了类似对控件的操作,例如点击“查词”的坐标。
03
最后我们还是用截屏,加上智云 OCR 识别,对页面的内容进行判断,例如对查词结果的验证。
这样就实现了基本的元素操作和控制。
我们就这样,把用户行为的自动化,设计并实现出来了。
![](https://img-blog.csdnimg.cn/img_convert/2a99004f60d8c6e920df3c8b1e198a2f.png)
正常情况下,OTA测试需要一名全职测试工作8小时,来完成30轮次升级的验证。
有了自动化的方案,这个过程实现了无人值守测试,每晚可以实现50-100轮次的验证,第二天测试人员只需要检查测试过程的记录即可。
六、总结
经过上面的这些步骤,我们基本上对有道词典笔 2.0 的用户最核心操作——扫描后划词翻译,实现了软件和硬件方面的自动化。
通过硬件和软件结合的自动化方案,我们得到的收益巨大:
大幅提升了测试效率: 单个版本需要120+小时的测试数据,包括但不限于功能测试、主功能稳定性测试、随机稳定性测试、功耗测试、充放电电池曲线测试、耳机稳定性测试、耳机兼容性测试、OTA 测试等等;这些测试85%可以通过以上的测试框架来自动测试,我们单个版本的测试只需要2-3天,1-2人即可完成。
明确了产品质量: 我们针对每一项测试设计了不同的质量指标(例如功耗分成12种场景,测试时在不同场景下进行验证),得出的结果和之前版本或者竞品进行对比,从而判断我们产品的质量好坏。一个版本会有上百个指标,而这些指标就告诉了我们产品是否可以上线,产品的质量到底如何。
帮助发现硬件生产过程中的质量问题: 某个版本在两个批次的硬件测试中,同样的测试脚本和测试方案,测试出来的数据差异明显。通过多轮次的验证,对硬件的拆解等判断,最终定位某电阻混件造成了差异,由于我们提早发现了这个问题,尚未完成生产的产线停工,避免了更大的损失。
作者/ 刘哲; 编辑/ Ryan ; 来源/ 有道技术团队(ID: youdaotech)