时间:2024-05-04
刘 萌
(南京特殊教育师范学院, 江苏 南京 210038)
随着互联网技术的飞速发展,Andriod系统在市场终端应用中呈现迅速扩张的趋势,如今的车载娱乐终端也大多基于Android操作系统,人机交互界面更美观,功能也日益复杂,这也导致了系统安全性和稳定性问题日益增多,在产品开发生命周期中不得不投入更多的时间和人力资源到测试环节中。车载娱乐终端产品一旦产生稳定性问题,不仅后期维护和纠正成本极高,还会给驾驶人员带来潜在的安全威胁。为解决上述问题,本文对Monkey及UIAutomator2两种Andriod自动化测试工具进行了研究,制定了随机和定制功能路径两种场景的自动化稳定性测试方案,并设计实现了基于Python二次开发的Monkey随机场景自动化测试工具和基于Python + Pytest +UIAutomator2的定制功能路径场景自动化测试工具。
Monkey是Android系统自带的一款基于命令行的自动化测试工具,主要用于测试Android应用程序及系统的稳定性和鲁棒性。Monkey通过向系统发送随机事件流来模拟用户操作。Monkey简单易用,对于发现应用程序和系统的应用程序无响应(Application Not Response,ANR)、Crash等异常具有显著的效果。
1.1.1 运行方式设计
Monkey测试的运行可以分为离线和在线两种运行模式。
在离线模式下,需要将Monkey命令参数编写成shell脚本推送到被测设备上,本地执行。这种模式对测试人员编程能力有一定要求,一旦测试步骤或参数需要更改,shell脚本就需要修改,而且在测试过程中,脚本无法实时识别到异常,不会去实时捕获日志,只能在测试结束后人工分析Monkey测试日志,找出问题及时间点,再去查找对应时间点的日志。如果问题出现的时间点较早,很可能日志已被覆盖掉,导致无法分析问题,像bugreport、dumpsys等实时性要求极高的日志,在测试结束后再抓取基本已经失去时效。另外,离线模式下Monkey测试本身产生的日志只能本地化存储,占据被测系统的存储空间,从而影响被测系统性能,干扰测试结果。
在线测试模式在测试过程中需要保持PC与被测设备的Android调试桥(Android Debug Bridge,ADB)连通,Python程序运行于PC上,脚本实时翻译实时下发。本文设计的Monkey测试工具采用在线运行方式。Monkey命令通过Python程序下发,所有Monkey日志重定向到本地PC,避免占用被测设备的存储空间。在测试过程中,Python程序还会另起线程实时读取并分析Monkey日志,一旦识别到异常就立即抓取系统全日志。这种方法一方面节省了人工分析问题的时间,一方面确保了日志的实时性和完整性。
1.1.2 测试模式设计
Monke测试工具提供了3种测试模式:单包、多包组合和系统级测试模式。
单包模式只对一个应用程序进行测试,通常应用于产品开发前期、应用程序逐个上线的阶段。不同的功能模块用户的操作习惯不同。因此,该模式需要根据实际操作场景设置不同的事件百分比。
多包组合模式同时针对多个应用进行并行测试,通常会选取用户使用频率最高的几个应用随机组合,测试过程必需涉及应用间的切换。
系统级测试模式不限定被测应用范围,对所有应用程序和系统组件进行并行测试,实现全功能联动。该模式主要应用于产品开发后期阶段的验收。
1.1.3 测试参数设计
Monkey测试参数主要分为3类:基本配置参数、事件类型参数和调试参数。
本方案中Monkey测试的目的有两种:项目早期阶段的问题发现测试(测试过程中忽略异常继续执行,以尽可能发现更多问题)和项目后期阶段的验收测试(测试过程中不忽略异常,出现异常即停止执行,并将验收结果判定为不通过)。不同测试阶段参数制定如下。
(1)基本配置参数设计。
级别(-v)设为最高-v-v-v,以输出尽可能详细的日志。
随机种子值(-s)默认为0,每轮测试更换一个随机值,代表从不同的起点开始新一轮的测试。
动作时间间隔(--throttle)在产品初期阶段设为1 s,后期平台功能稳定后设定为300 ms。
在-p参数后指定测试包可以实现上述3种测试模式。每轮测试的操作次数Count参数由计划测试时长决定,计算公式为:Count=测试时长(ms)/--throttle。
(2)事件类型参数设计。
操作事件类型的百分比值根据不同被测模块的功能区别设定,百分比总和不超过100%。
(3)调试参数设计。
在问题发现测试阶段,将异常和超时参数设置为ignore;在验收测试阶段,不设置此类参数。Monkey命令示例:adb shell monkey-p xxx-p xxx-s 0--throttle 300--pct-touch 40--pct-motion 20--pct-syskeys 10--pct-anyevent 10--pct-appswitch 10--pct-flip 5--pct-pinchzoom 5--ignore-crashes--ignore-timeouts--ignore-security-exceptions--ignore-native-carshes-v-v-v 5000
1.1.4 运行过程设计
数据交换接口通常采用xml格式来实现。本工具中用户配置接口即设计为一个xml文件,其中包含了Monkey测试参数、测试模式、被测系统的日志路径、检测门限值等参数。用户只需在此文件中填写参数值即可实现不同测试方案的更改。主程序在执行测试时会首先解析该xml文件,读取用户设置的参数。执行流程如图1所示。
图1 Monkey测试工具执行流程
在产品开发前期阶段,系统还不稳定,Monkey工具发现了较多黑屏、冻屏、死机等重大问题。在产品开发中后期阶段,系统趋于稳定,Monkey测试可以持续运行较长时间,更全面地发现了ANR、Crash等异常。工具在日志抓取方面做到了实时、全面,能够满足开发分析的需求。
Python是全球最受欢迎的编程语言之一[1],拥有丰富的测试框架和工具[2],如Robot Framework、Pytest、Unitest等,而Pytest是最受欢迎和最具影响力的一个。UIAutomator2是Android UI自动化测试的开源工具之一,可以对任意应用程序的任意一个控件属性进行任意操作,开发者们推出的Python-UIAutomator2提供了Python接口,支持Python编程。
Python-UIAutomator2的运行主要涉及两个部分:Python客户端和被测设备。UIAutomator2的运行环境需要进行以下配置:(1)被测设备端打开开发者选项,以ADB方式连接PC。在PC的CMD窗口执行adb devices,查看设备是否成功连接。(2)PC端安装Python 3.x;安装UIAutomator2,在CMD窗口执行pip install UIAutomator2;安装WEditor。(3)在PC端CMD窗口执行Python-UIAutomator2 init,安装被测设备端的HTTP RPC服务apk、atx-agent等。这些是UIAutomator2运行的必要工具。
Monkey工具对于智能车载娱乐系统而言,无法涉及与车上其他电子控制单元(Electronic Control Unit,ECU)的控制器局域网络(Controller Area Network,CAN)[3]通信车载协议测试。为解决这个问题,本文引入了定制功能路径的测试方案。定制功能路径测试具有以下优点:(1)测试步骤根据用户实际操作设计,测试场景更接近用户行为。(2)支持个性化定制,可以根据不同功能模块的特点,定制个性化的测试步骤。(3)支持压力测试:可以通过设置Pytest装饰器的参数值重复执行指定脚本,以检查系统的稳定性。
定制功能路径测试的目的有2个:功能验证和性能验证。前者重点关注系统在执行一般用户操作(如点击、按键、滑动等)后的系统反应是否正确。后者主要通过反复执行某一类型的操作,如蓝牙、Wi-Fi的开关/断连、系统软重启、休眠/唤醒等,来检查系统功能和状态在重复压力或长期运行下是否稳定。这种测试对于发现系统内存泄漏以及稳健性相关的问题非常有效。
定制功能路径测试分为常规操作类、Can信号交互类和性能测试等场景。常规操作类测试涵盖了用户常见的操作行为。Can信号交互类测试则关注系统在与其他ECU通信时系统状态及反馈是否正确。性能测试则是通过大量操作后,测量系统的关键性能指标,如冷启动/热启动时长和开机时序等,对系统进行全面的性能评估,以确保产品满足出厂及市场标准。定制功能路径测试具体场景设计如下:(1)单App全功能链路验证,主要用于验证单个应用程序的基本功能。(2)多App全功能链路交互验证,主要用于验证多个应用程序之间交互是否正常。(3)典型单场景操作,如开关反复开闭、休眠唤醒等,主要用于验证系统关键功能是否稳定。(4)性能测试,冷/热重启、休眠唤醒等场景重复执行百遍后,验证启动时序、统计平均开机时长。(5)场景复现,针对一些较难复现的bug开发特定的测试脚本尝试复现,出具复现概率报告或压力测试报告。
(1)界面元素获取工具。
本文使用WEditor来定位元素,WEditor基于Python,能提供辅助编写脚本和调试代码的功能,可以通过浏览器轻松打开,简单易用。WEditor可方便获取到元素的Xpath属性(Xpath是元素的绝对唯一属性)。
(2)测试脚本工程架构。
基于UIAutmator2的自动化测试工具框架及整体运行流程设计如图2所示。
图2 UIAutomator2自动化测试工具框架及流程
① Main.py为测试引擎,主要完成测试报告的创建、测试套件配置参数的获取、各种路参数径的获取、测试命令下发等。
② Config路径下存放test_cfg.py和xpath_cfg.py。前者用于存储测试套件的配置参数,如测试环境、用例、数据等。后者用于存储测试用例用到的参数,如XPath值、Can信号值等。
③ TestCases路径下存放所有测试脚本文件,每个功能模块对应一个.py文件,每个测试用例对应一个函数,用例运行策略由Pytest装饰器参数值指定。
④ util.py是一个集合了所有公共函数的Python文件,如环境恢复、xml文件解析、用户操作、Can信号收发、Log抓取、系统状态检查等。
⑤ TestReports路径下存放测试报告,每轮测试都会创建一个新的网页版测试报告。测试报告中可以包含测试结果、执行时间、测试用例的通过或失败状态等信息。
(3)Can 信号收发工具使用开发。
本文工具针对Pcan测试仪开发Python脚本,通过对PCanBasic.dll进行二次开发来实现。PCan Basic.dll的原生函数有:Initialize(初始化一个PCan设备的PCan通道)、Uninitialize(取消初始化)、GetStatus(获取当前PCan通道的Bus状态)、Read(从消息接收队列中读取Can消息及其时间戳)、Write(发送Can消息)等函数,对上述源码进行Python二次封装,编写更易于测试人员使用、更符合项目需求的公共方法(如Send()、Receive()、Check())等,汇集到PCanBasic.py文件,测试用例中导入PCanBasic.py即可使用封装的函数。
在产品开发的中后期阶段,系统已逐步趋于稳定,每次软件发布版本后使用自动化脚本即可完成大部分基础功能验证,无需人工再次轮询测试用例,极大地节省了人力和时间成本。此外,在压力和性能测试方面,该工具获取的数据比手动测试更为科学准确,帮助了产品团队迅速准确地了解产品的性能,为产品的优化和改进提供了坚实的依据。UIAutomator2自动化测试工具在保证产品质量、提高测试效率以及节省时间和人力成本等方面都发挥了人工测试不可替代的作用。
本文通过对智能Andriod车机系统稳定性测试方案及Monkey和UIAutomator2自动化测试工具的研究,设计并实现了2种自动化稳定性测试工具。这些工具在实际项目中切实提高了工作效率和产品质量。随着车联网和智能网联产品的不断发展,IVI娱乐系统的稳定性测试将越来越受到重视,类似的自动化测试工具将发挥更为广泛和重要的作用,对于推动车载智能产品的发展有着重要的意义。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!