测试是应用开发流程中的重要环节。 对于 Android,这尤为重要,因为 Android 设备彼此之间差异很大,主要体现在以下几个方面:
- 屏幕尺寸和分辨率
- Android 版本
- 外形
- 处理器的指令集
- 是否有前置摄像头、NFC、外置键盘等。
您应在多台设备上对 Android 应用进行测试。
应用测试流程包括多种测试。 让我们来了解一下手动功能测试。 测试者需要认真检查所有功能并将设备重置为初始状态。 测试者在每个应用和每部设备上重复上述操作。 该流程是手动完成的,因此非常耗时。
自动功能测试可按计划执行而无需额外成本。 例如,测试一个 build,每天晚上在所有设备上进行测试,早上分析结果并修复漏洞。
在本文中,我们将回顾几种适用于自动功能测试的工具。 我仅对 Android SDK 中包括的或在开源许可协议下发布的工具进行介绍。
自动测试的概念
我们的目标是将手动执行的操作自动化,以实现最大精度。 让我们了解一下这些操作。 我们将使用多个应用和多部 Android 设备。
对于每个应用和每部设备,我们应按照下列步骤来操作:
- 在设备上安装应用
- 启动应用
- 使用指定方法测试应用
- 卸载应用
- 将设备重置为初始阶段
在每个步骤中,您需要收集和分析数据,如日志和截屏。 在下文中,我们将讨论将这些步骤自动化的工具。
控制 Android 设备
首先,您需要选择用于运行自动化测试的电脑,并在该电脑上安装 Android SDK。 我将以运行 Linux* 系统的台式电脑为例。 您需要在每台设备上禁用锁屏并将“进入睡眠模式的时间”调整到最大值。对于一些方法 您需要禁用屏幕方向调整。
Android SDK 中有两种实用程序可以控制 Android 设备: ADB 和 monkeyrunner*。 下面,我将具体介绍如何将手动测试中的操作自动化。
使用 ADB 控制 Android 设备
ADB (Android Debug Bridge)是控制 Android 设备的命令行工具。 ADB 主页是: http://developer.android.com/tools/help/adb.html
ADB 工具位于 <android_sdk>/platform-tools/
目录下。您需要将该目录存放到 PATH
环境变量下。
检查 ADB 安装
安装并设置 Android SDK,然后将 Android 设备连接至您的电脑并运行下列命令:
adb devices
该命令将出现在所有插入的 Android 设备上。 如果设备列表不是空白,那么 ADB 便可正常运行。
在多台设备上运行
您需要使用“-s”参数指定 ADB 应使用哪台设备。
adb -s [serial_number] [command]
例如:
adb -s [serial_number] logcat
设备的序列号可通过输入 «adb devices» 命令后生成的输出中获得。 参数 -s
支持您同时使用多台互联设备。
基本的 ADB 命令
在设备上打开控制台:
adb shell
在设备上运行命令:
adb shell [command]
Android 中包含许多标准的 Linux 实用程序: ls、cat、dmesg ...
从 apk 文件安装应用:
adb install example.apk
卸载应用:
adb uninstall [package]
从 apk 文件获取程序包名称:
aapt dump badging example.apk | grep "Package"
从设备将文件下载至电脑:
adb pull [path-on-device] [file]
从设备将文件上传至电脑:
adb push [file] [path-on-device]
注:
Android 设备上的大多数目录仅支持读取访问。 /sdcard
(但是您无法从该目录下运行程序)和 /data/local/tmp
支持写入访问。
启动应用:
adb shell am start -n [package]/[activity]
运行指定活动。
您可以从 apk 文件抽取活动名称:
aapt dump badging example.apk | grep "launchable-activity"
读取日志
Logcat 是从 Android 设备读取日志的命令。
Logcat 主页:http://developer.android.com/tools/help/logcat.html
从设备读取日志(按下 Ctrl-C 解除阻止):
adb logcat
清除设备上的日志缓存:
adb logcat -c
将日志缓存转储到设备上(显示当前的缓存内容,未阻止):
adb logcat -d
示例:
1 |
adb logcat -c # clear the buffer log
|
2 |
# Action |
3 |
adb logcat -d > file .log # save the current contents of the log buffer to file.log
|
使用 screencap 截取屏幕
screencap
实用程序将当前的屏幕内容保存为图形文件:
1 |
adb shell screencap /sdcard/ screen .png
|
2 |
adb pull /sdcard/ screen .png screen .png
|
3 |
adb shell rm /sdcard / screen .png
|
screencap
实用程序可在安装了 Android 4.x 和更高版本的手机上使用。 在低于 Android 4.x 的版本上,您可以使用 monkeyrunner 来截取屏幕。
使用 ADB 运行 BASH 脚本来测试应用
脚本: app_test.sh
使用 MonkeyRunner 控制 Android 设备
monkeyrunner 工具可为脚本提供控制 Android 设备的 API。 您可以使用 monkeyrunner 编写 Python* 脚本来安装、启动 Android 应用,模拟用户操作,获取截图并将其保存至电脑。 Monkeyrunner 使用 Jython* 运行脚本。
monkeyrunner 主页和 API 参考: http://developer.android.com/tools/help/monkeyrunner_concepts.html
使用 monkeyrunner 读取日志
File log.py:
01 |
# coding: utf-8 |
02 |
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
|
03 |
04 |
def log(fn, device):
|
05 |
msg = device.shell( 'logcat -d' )
|
06 |
f_log = open (fn, 'at' )
|
07 |
if msg is None :
|
08 |
msg = 'None'
|
09 |
f_log.write(msg.encode( 'utf-8' ))
|
10 |
f_log.close()
|
11 |
device.shell( 'logcat -c' )
|
12 |
13 |
if __name__ = = '__main__' :
|
14 |
device = MonkeyRunner.waitForConnection()
|
15 |
device.shell( 'logcat -c' ) # Clear logs buffer
|
16 |
# ...
|
17 |
log( 'example.log' , device) # Write logs
|
开始:
monkeyrunner log.py
脚本将会把日志写入当前目录下名为“文件示例.log”的文件。
使用 MonkeyRunner 捕捉截图
File screen.py:
1 |
# coding: utf-8 |
2 |
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
|
3 |
4 |
if __name__ = = '__main__' :
|
5 |
device = MonkeyRunner.waitForConnection()
|
6 |
image = device.takeSnapshot()
|
7 |
image.writeToFile( 'screenshot.png' , 'png' )
|
开始:
monkeyrunner screen.py
脚本捕捉截图并在当前目录下将其保存为名为 filescreenshot.png 文件。
示例:使用 monkeyrunner 控制设备
开始:
monkeyrunner monkeyrunner_test.py
自动测试方法
使用 Monkey* 进行测试
试想将正在测试的设备交给一只非常敏捷且极富创造力的猴子 — Monkey(猴子)工具的设计便是模拟这种情形。Monkey 工具是 Android SDK 的组成部分,可发送一连串的随机用户事件。命令行参数可指定用户操作次数、每类事件的比率和程序包的名称(因此,Monkey 的操作不会超出所测试应用的限度,且不会向地址簿中的任何联系人发送 SMS)。
Monkey 主页上提供了诸多示例和参数列表: http://developer.android.com/tools/help/monkey.html
Monkey 工具的主要优点是零维护成本。 而且,压力测试还可检测出 non-trivial 漏洞。
使用 Monkey 工具进行测试的缺点:
- Monkey 无法模拟复杂的工作负载,如身份验证。 因此,应用的功能性无法进行测试。
- 需要复杂控制(快速反应和复杂手势)的游戏应在开始时完成,或不要执行该类应用的测试。
- Monkey 发现的错误很难再现。
- Monkey 无法在测试过程中检查应用状态。
对于任何应用而言,开始都可以先使用 Monkey 进行自动测试。 这种方法可为具体应用提供充足的结果。如果测试质量较低,您需要使用其他测试方法。
使用 MonkeyRunner 进行测试
使用 MonkeyRunner,您不仅可以开发 Android 设备控制脚本,还可以编写脚本在特定设备上测试应用。
优点:
- 灵活。
缺点:
- 编写脚本较复杂 — 即使是在简单的情况下。
开发 MonkeyRunner 需要花费很长的时间,因此通常这种方法不太理想。但是在某些情况下可以使用这种方法。
使用 getevent 和 sendevent 进行测试
Getevent 和 sendevent 实用程序支持用户记录事件序列并将其再现。运行这些工具不需要根许可。
优点:
- 在手动测试下,无需花费额外成本便可记录事件序列(如果执行)。
- 记录事件序列不需要编程技能。
缺点:
- 需单独为每个应用和每部设备记录序列。如果您更改了一个应用界面,需要重新记录所有已记录的操作。
- 这种方法无法在测试过程中检查应用状态。 如果应用响应延迟(如网页加载),测试结果将出现错误。
- 演示快速、复杂的序列所需的时间比记录的时间长。 因此,有时候这种方法不适合测试响应时间较为关键的动态游戏(dynamic game)。
记录事件序列:
01 |
# Record event sequence |
02 |
# Do actions on the device, press Ctrl-C to finish |
03 |
adb shell getevent -t > events.txt |
04 |
# Convert event sequence to script |
05 |
./decode_events.py events.txt > events.sh |
06 |
# Load the script to the device |
07 |
adb push events.sh /data/ local /tmp/
|
08 |
# Set the permissions |
09 |
adb shell chmod 755 /data/ local /tmp/events.sh
|
10 |
# Run script |
11 |
adb shell sh /data/ local /tmp/events.sh
|
脚本: decode_events.py
在设备上再现记录的事件序列。
使用 Robotium* 进行测试
Robotium 未包含在 Android SDK 中,但是它是在开源协议下发布的产品。 Robotium 主页是: http://code.google.com/p/robotium/。
Robotium 脚本可在应用 UI 层面而非输入设备层面定义操作。
例如,脚本需要点击 «OK» 按钮。 monkeyrunner 脚本将按照“点击屏幕点(x0, y0)”执行。 Robotium 脚本将按照“按下带有文本“OK”的按钮”执行。
当在界面层面描述操作时,测试脚本将不受界面布局、界面分辨率和方向的影响。
此外,Robotium 还支持您检查应用对操作的响应。例如,点击 «OK» 按钮后,将会出现带有“Item 1”的列表项目。您还可以使用 Robotium 查看列表元素的名称。 如果您可以在每一步之后检查应用状态,便很容易找到错误出现在哪一步。
缺点:
- 您需要在 Java* 中为每个应用开发一个测试脚本。 这需要编程技巧,也较为费时。
- 应用界面更改后,必须重新安排事件序列。
- 相比使用 getevent / sendevent 而言,编写 Robotium 校本更为困难。
一般而言,Robotium 支持您以适度的成本开发最高质量的测试案例。
测试方法比较
Monkey — 一连串随机用户操作 |
无维护成本。 |
测试质量在不同的应用上会有所差异。 Monkey 无法在测试过程中检查应用状态。 |
monkeyrunner — 设备控制脚本 |
灵活性 |
编写脚本较复杂 — 即使针对简单的应用。 |
getevent/sendevent — 记录/再现用户操作 |
记录事件序列不需要编程技能。 |
记录的操作序列仅可在一台设备上以固定的界面方向执行。 应用界面更改后,必须重新安排事件序列。 这种方法无法在测试过程中检查应用的状态。 |
Robotium — 测试脚本 API 以验证状态 |
操作在应用 UI 层面描述。 脚本可能不会受到界面分辨率和界面方向的影响。 脚本可在一个操作后检查应用状态。 |
在 Java 编写脚本较复杂。 如果您更改了应用界面,将需要修改脚本。 |
结果分析
现在,我们需要分析在自动错误测试流程过程中收集的日志和截屏。
日志分析
您可以搜索一下以下的字符串:
- I/DEBUG
- FATAL EXCEPTION
- WIN DEATH
您可以在该列表中添加在手动测试中发现的错误消息。
截屏分析
您可以准备一系列测试关键时刻的截屏,并在自动测试时将其与屏幕内容进行对比。 这可以确定自动测试流程是否正常运行。
将最初的截屏与应用启动后的截屏进行对比非常有用。 它可以在应用出现静默故障时检查事件。
Monkeyrunner 支持您按照指定的容错性(百分比)对比两个截屏:
1 |
image1 = device.takeSnapshot()
|
2 |
# ... |
3 |
image2 = device.takeSnapshot()
|
4 |
if image2.sameAs(image1, 0.1 ):
|
5 |
print 'image1 and image2 are the same (10%)'
|
很遗憾,没有 MonkeyImage API 可用于加载文件中的图片。 您可以使用,如 Python* Imaging Library 编写一个自定义功能来对比图片。
将设备重置为初始状态
您应在测试后将设备重置会初始状态。这可以通过下列几种方法来实现:
- 多次按下 «Back» 按钮。
- 重启设备。
- 重启 zygote 流程。
通常情况下,第一个选项最合适。
多次按下 Back 按钮
使用 monkeyrunner 按 “Back” 按钮:
1 |
for i in xrange ( 0 , 10 ):
|
2 |
device.press( 'KEYCODE_BACK' , MonkeyDevice.DOWN_AND_UP)
|
3 |
time.sleep( 0.5 )
|
在实际情况下这是较好的选择,因为它不需要用户实际操作。
结论
在本文中,我们介绍了几种针对 Android 应用的自动测试方法。 我们回顾了自动测试方法的优点和缺点。
此外,我们还讨论了 Android SDK 中的 Monkey 和 monkeyrunner 工具以及 Robotium 工具。
自动测试不能取代其他类型的测试。正确的有组织的测试流程(结合包括自动测试在内的不同测试方法)是高质量应用开发流程的必要部分。
下载 app-test.zip | 571 字节 |
下载 decode-events.zip | 815 字节 |
下载 monkeyrunner-test.zip | 756 字节 |
相关推荐
"基于Comsol的采空区阴燃现象研究:速度、氧气浓度、瓦斯浓度与温度分布的二维模型分析",comsol采空区阴燃。 速度,氧气浓度,瓦斯浓度及温度分布。 二维模型。 ,comsol; 采空区; 阴燃; 速度; 氧气浓度; 瓦斯浓度; 温度分布; 二维模型;,"COMSOL模拟采空区阴燃:速度、浓度与温度分布的二维模型研究"
安全驱动的边云数据协同策略研究.pdf
MATLAB代码实现电-气-热综合能源系统耦合优化调度模型:精细电网、气网与热网协同优化,保姆级注释参考文档详可查阅。,MATLAB代码:电-气-热综合能源系统耦合优化调度 关键词:综合能源系统 优化调度 电气热耦合 参考文档:自编文档,非常细致详细,可联系我查阅 仿真平台:MATLAB YALMIP+cplex gurobi 主要内容:代码主要做的是一个考虑电网、热网以及气网耦合调度的综合能源系统优化调度模型,考虑了电网与气网,电网与热网的耦合,算例系统中,电网部分为10机39节点的综合能源系统,气网部分为比利时20节点的配气网络,潮流部分电网是用了直流潮流,气网部分也进行了线性化的操作处理,代码质量非常高,保姆级的注释以及人性化的模块子程序,所有数据均有可靠来源 ,关键词:MATLAB代码; 电-气-热综合能源系统; 耦合优化调度; 电网; 热网; 气网; 潮流; 直流潮流; 线性化处理; 保姆级注释; 人性化模块子程序; 可靠数据来源。,MATLAB代码:电-气-热综合能源系统耦合优化调度模型(保姆级注释,数据来源可靠)
内容概要:本文详细探讨了人工智能(AI)对就业市场的深远影响及其发展趋势。首先介绍了到2027年,44%的工人核心技能将受技术变革尤其是AI影响的事实,并提及自动化可能取代部分工作的现象。其次指出虽然某些职位面临风险,但也带来了全新的职业机遇与现有角色改进的可能性,关键在于人类要学会借助AI释放自身潜力并培养软实力,以适应快速发展的科技需求。再者,强调终身学习理念下企业和教育培训须革新教学手段与评估机制,以便紧跟AI进化速率,为个体和社会持续注入新动力。最后提到了教育机构应当加快调整步伐以匹配技术变革的速度,并利用AI实现个性化的教育,进而提升学习者的适应能力和解决问题的能力。 适用人群:政策制定者、企业管理层、在职人员及教育工作者,还有广大学生群体均能从中获得启示。 使用场景及目标:面向关注未来职场动向及教育发展方向的专业人士,提供前瞻性思考角度,助力各界积极规划职业生涯路径或调整教育资源分配策略。 其他说明:本文综合多位行业领袖的观点展开讨论,旨在唤起社会各界共同思考AI带来的变革及对策,而非单方面渲染危机感。
2025最新空调与制冷作业考试题及答案.doc
2025最新初级电工证考试题及答案.docx
飞剪PLC控制系统——采用西门子S7-200SMART和触摸屏实现智能化操控及图纸详述,飞锯追剪程序,PLC和触摸屏采用西门子200smart,包含图纸,触摸屏程序和PLC程序。 ,核心关键词:飞锯追剪程序; 西门子200smart; PLC程序; 触摸屏程序; 图纸; 控制系统。,"西门子200smart飞锯追剪系统程序包:含图纸、PLC与触摸屏程序"
使用PyQt6制作的Python应用程序。
三相桥式整流电路双闭环控制策略:电压外环与电流内环协同优化研究,三相桥式整流电路双闭环控制 电流内环 电压外环(也有开环控制) 采用电压电流双闭环控制,在电压、电流控制电路中,电压单环控制易于设计和分析,但是响应速度慢,无限流功能。 而电流环能增强电路稳定性、响应速度快。 三相桥式全控整流电路由整流变压器、阴极相连接的晶闸管(VT1, VT3, VT5)、阳极相连接的晶闸管(VT4, VT6, VT2)、负载、触发器和同步环节组成(如图1),6个晶闸管依次相隔60°触发,将电源交流电整流为直流电。 matlab仿真模型(开闭环都有)控制效果良好,可写报告。 ,三相桥式整流电路;双闭环控制;电流内环;电压外环;开环控制;MATLAB仿真模型。,基于双闭环控制的电压电流三相整流技术分析与Matlab仿真实现
MATLAB四旋翼仿真PID控制:从入门到精通的手把手教学,含QAV方法、模型代码、Simulink布局思路及详细图文说明,MATLAB四旋翼仿真 PID控制,有完全对应的说明文档,专门为初级学习者提供。 不用问在不在,直接拿即可。 亮点: 拥有和模型完全对应的讲解文档,相当于手把手教学。 内容包括: 1.QAV详细方法 2.模型及代码 3.模型2(提供simulink排版布局思路) 4.相关图片 5.使用备注 ,核心关键词:MATLAB四旋翼仿真; PID控制; 完全对应说明文档; 初级学习者; QAV详细方法; 模型及代码; simulink排版布局思路; 相关图片; 使用备注。,"MATLAB四旋翼仿真教程:PID控制详解与手把手教学"
定子磁链控制下的直接转矩控制系统MATLAB仿真研究及结果分析报告,基于定子磁链控制的直接转矩控制系统 MATLAB SIMULINK仿真模型(2018b)及说明报告,仿真结果良好。 报告第一部分讨论异步电动机的理论基础和数学模型,第二部分介绍直接转矩控制的具体原理,第三部分对调速系统中所用到的脉宽调制技术CFPWM、SVPWM进行了介绍,第四部分介绍了MATLAB仿真模型的搭建过程,第五部分对仿真结果进行了展示及讨论。 ,关键词:定子磁链控制;直接转矩控制系统;MATLAB SIMULINK仿真模型;异步电动机理论基础;数学模型;直接转矩控制原理;脉宽调制技术CFPWM;SVPWM;仿真结果。,基于MATLAB的异步电机直接转矩控制仿真研究报告
2025中小学教师编制考试教育理论基础知识必刷题库及答案.pptx
Python游戏编程源码-糖果消消消.zip
三相PWM整流器双闭环控制:电压外环电流内环的SVPWM调制策略及其代码编写详解——动态稳态特性优越的技术参考。,三相PWM整流器双闭环控制,电压外环,电流内环,PLL。 采用SVPWM调制,代码编写。 动态和稳态特性较好,可提供参考资料 ,三相PWM整流器;双闭环控制;电压外环;电流内环;PLL调制;SVPWM调制;动态特性;稳态特性;参考资料,三相PWM整流器双闭环SVPWM调制策略:稳态与动态特性优化参考指南
永磁同步电机滑膜观测器参数识别与仿真研究:转动惯量、阻尼系数及负载转矩的Matlab Simulink仿真分析文章及文档说明,永磁同步电机 滑膜观测器参数识别Matlab simulink仿真 包括转动惯量 阻尼系数 负载转矩 波形很好 跟踪很稳 包含仿真文件说明文档以及文章 ,关键词:永磁同步电机;滑膜观测器;参数识别;Matlab simulink仿真;转动惯量;阻尼系数;负载转矩;波形质量;跟踪稳定性;仿真文件;说明文档;文章。,基于Matlab Simulink仿真的永磁同步电机滑膜观测器参数识别及性能分析
基于永磁涡流的电梯缓冲结构设计.pdf
Python自动化办公源码-28 Python爬虫爬取网站的指定文章
MATLAB下的安全强化学习:利用Constraint Enforcement块训练代理实现目标接近任务,MATLAB代码:安全 强化学习 关键词:safe RL 仿真平台:MATLAB 主要内容:此代码展示了如何使用 Constraint Enforcement 块来训练强化学习 (RL) 代理。 此块计算最接近受约束和动作边界的代理输出的动作的修改控制动作。 训练强化学习代理需要 Reinforcement Learning Toolbox 。 在此示例中,代理的目标是使绿球尽可能靠近红球不断变化的目标位置。 具体步骤为创建用于收集数据的环境和代理,学习约束函数,使用约束强制训练代理,在没有约束执行的情况下训练代理。 ,核心关键词:safe RL; MATLAB代码; Constraint Enforcement 块; 强化学习代理; 绿球; 红球目标位置; 数据收集环境; 约束函数; 约束强制训练; 无约束执行训练。,MATLAB中安全强化学习训练的约束强化代理实现
基于EtherCAT总线网络的锂电池激光制片机控制系统,融合欧姆龙NX系列与威伦通触摸屏的智能制造方案。,锂电池激光模切机 欧姆龙NX1P2-1140DT,威伦通触摸屏,搭载从机扩展机架控制,I输入输出IO模块模拟量模块读取控制卷径计算 汇川IS620N总线伺服驱动器7轴控制,总线纠偏器控制 全自动锂电池激光制片机,整机采用EtherCAT总线网络节点控制, 伺服凸轮同步运动,主轴虚轴控制应用,卷径计算,速度计算,放卷张力控制。 触摸屏设计伺服驱动器报警代码,MC总线报警代码,欧姆龙伺服报警代码 张力摆臂控制,PID控制,等等 触摸屏产量统计,触摸屏故障统计,触摸屏与PLC对接信息交互,触摸屏多账户使用,多产品配方程序,优秀的触摸屏模板。 NX在收放卷控制的设计 欧姆龙NX系列实际项目程序+威纶触摸屏程序+新能源锂电设备 涵盖威纶通人机,故障记录功能,st+梯形图+FB块,注释齐全。 ,"新能源锂电池激光模切机:欧姆龙NX与威纶通触摸屏的智能控制与信息交互系统"
2025装载机理论考试试题库(含答案).pptx