中断测试有助于移动测试人员识别与系统或用户行为相关的潜在风险,以便在发生流量干扰时能够识别出可能导致意想不到或不期望结果的问题。
让我们深入探讨中断测试的细节及其手动或程序化实现方式。本文还介绍了用于自动化测试过程、加快测试执行速度并向用户提供高质量应用的移动工具,例如 Appium WebDriver。
什么是中断测试?
APP中断测试是一种软件测试方法,专注于评估移动应用程序在遭遇意外中断或外部事件干扰时的响应能力与稳定性。这些中断可以是由用户操作、系统事件、网络条件变化或其他应用程序的活动触发的。中断测试旨在确保应用能够优雅地处理这些中断,并在中断事件结束后恢复到预期状态,从而提供良好的用户体验。
“中断”这个词对于任何人来说都是一个令人不快的词,除非它的后果能为被中断的工作带来更好的前景。任何形式的工作中断通常都被认为是不可接受的,因为它不仅阻碍了进度,还中断了与任务相关的连续性和节奏。虽然人类在受到干扰后通常能够回忆起并继续完成任务,但这样会让你失去注意力和节奏。
为什么要进行中断测试?
提高用户体验:在现实使用中,用户可能随时因为电话、短信、通知、切换应用或设备锁定等事件而中断应用操作。如果应用不能妥善处理这些中断,可能会导致数据丢失、应用崩溃或用户界面混乱,严重影响用户体验。
确保数据一致性与完整性:中断测试帮助验证在中断发生前后,应用内部数据和用户数据是否保持一致性和完整性,避免因中断造成的数据损坏或丢失。
增强应用稳定性:通过模拟各种中断场景,开发者能发现并修复潜在的稳定性问题,增强应用在不同环境下的健壮性。
满足真实使用场景:移动设备用户经常在复杂的网络环境和多任务操作下使用应用,中断测试确保应用在这些复杂的真实世界情境中仍能正常工作。
优化资源管理:中断测试还能揭示应用在资源管理方面的问题,比如内存泄漏或不恰当的资源占用,尤其是在长时间后台运行或被系统暂停后恢复时。
遵循操作系统行为:随着操作系统更新,新的中断行为或规则可能出现,中断测试有助于确保应用与最新操作系统特性兼容,正确响应系统级中断。
中断测试的类型
中断测试涉及多种类型,以确保应用程序能够在不同的外部事件或用户操作中断后仍能正常运行。以下是一些常见的中断测试类型:
来电中断:
呼叫挂断:测试应用在用户接听电话后挂断通话时的表现。
被呼叫挂断:当应用正在运行时,用户接到电话并选择挂断来电的表现。
通话挂断:用户在使用应用过程中主动结束通话的处理情况。
通话被挂断:对方结束通话后,应用的恢复情况。
通知中断:
接收短信:检查应用在收到短信时的响应和恢复能力。
查看短信:用户中断应用操作去查看并回复短信后,应用能否正常恢复。
通知栏通知:应用在接收到系统或其他应用的通知时的表现。
电源管理中断:
电池电量不足:测试低电量警告弹出时应用的行为。
充电状态改变:插拔充电器时,应用是否能正确响应电量变化。
电池耗尽自动关机:模拟电池完全耗尽导致的关机对应用的影响。
网络中断与变化:
网络切换:从Wi-Fi切换到移动数据或反之,应用的连接处理能力。
网络信号弱/丢失:在弱网或无网络环境下应用的容错与恢复机制。
飞行模式切换:开启和关闭飞行模式时,应用对网络断开和重连的处理。
多任务与应用切换:
应用切换:用户在多个应用之间切换时,应用的状态保存与恢复。
后台运行:应用在后台长时间运行或被系统暂停后的表现。
硬件按钮中断:
锁屏/解锁:测试锁屏和解锁操作对应用状态的影响。
Home键/最近任务键:按下Home键回到桌面或使用最近任务键切换应用的反应。
系统更新中断:
系统更新:在操作系统更新过程中或更新后应用的兼容性和稳定性。
外部设备中断:
耳机插拔:耳机连接或断开时,音频相关应用的功能表现。
蓝牙设备连接/断开:蓝牙设备交互时的稳定性测试。
电话
如果一个应用程序正在运行,并且收到了一个来电,测试应用程序如何处理中断是很重要的。它是暂停还是停止运行?它是否允许用户在接听电话的同时继续使用该应用程序?
例如,使用模拟器执行以下命令:adb
adb shell am start -a android.intent.action.CALL
- 1
或者,在带有扩展控制的模拟器上进行呼叫测试:
短信
与打电话类似,收到的短信也会打断应用程序并导致其暂停或退出。这种类型的中断测试应用程序在被使用时如何处理收到的短信,并确保在中断结束后应用程序能够正确地恢复运行。
例如,在模拟器上使用 adb
模拟一条短信:
通知或警报
移动应用通常会发送(推送)通知,提醒用户有关新事件或更新的信息。测试应用程序如何处理通知以及用户在通知显示期间是否能够继续使用应用程序是很重要的。
系统警报
操作系统可能会发出警报或通知来中断应用程序的运行。重要的是要测试应用程序如何处理这些中断,以及它是否允许用户在显示警报时继续使用应用程序。
系统更新
该系统可以终止应用程序的进程。如果在应用程序正在运行时设备的操作系统被更新,可能会中断应用程序并导致其关闭。重要的是要测试应用程序如何处理这些中断,并确保在更新完成后应用程序可以正确地恢复运行。
低电量或电力不足
如果设备电池电量低或设备断电,可能会中断应用程序并导致其关闭。测试应用程序如何处理中断以及是否允许用户在设备充电时继续操作并保存所有重要数据非常重要。
多任务处理 | 应用程序切换 | 多窗口
许多移动设备允许用户同时执行多个任务并切换多个应用程序。测试应用程序如何处理多任务操作以及是否允许用户在使用其他应用程序的同时继续使用该应用程序非常重要。应用程序切换测试了应用程序在从前景切换到后台时的处理方式。
设备屏幕旋转
这种中断测试了应用程序如何处理设备从竖屏模式切换到横屏模式或反之的过程。我们需要验证用户进度在屏幕旋转前后是否保持完整。最近我发现一个移动电商应用程序存在一个bug,由于购物车元素在横屏模式下不可见/不可用,导致端到端用户流程无法完成。
网络环境
如果设备的网络连接在应用程序运行期间发生变化(例如从WiFi切换到移动数据),可能会中断应用程序并导致其行为发生变化。有时,即使移动信号较弱,WiFi信号也可能很强。如果出现这种情况,用户可能会连接到WiFi网络以寻求改善。为了测试移动信号的质量,可以考虑移至较高的位置并尝试不同的位置,因为移动塔的位置很重要。另一个好主意是在移动应用测试策略中包括各种网络速度(4G、5G等)。测试应用程序如何处理这些中断并确保其在不同网络条件下正常运行非常重要。
此外,在预期有大量活动的情况下,提前重新评估应用程序的网络需求是明智之举,重点是确保为客户提供可靠的网络体验。例如,将于2024年4月8日发生的日全食,就像其他天文事件一样,可能会影响网络性能。如图所示,北美地区的网络弹性可能会受到影响。
沿“日全食路径”的各个地点吸引了最多的人群。虽然无线网络不受影响,但当地居民和游客的网络使用激增可能会导致稳定的连接变得稀缺。
在应用程序使用过程中可能会出现各种类型的中断,因此进行此类中断测试至关重要,以确保应用程序能够提供流畅、无缝、不间断、稳定且一致的用户体验。可以考虑将负载测试纳入移动性能策略,同时考虑各种网络速度/条件和电池电量组合的情况。
语言输入
我们的开发人员可能只根据一套狭窄的规格进行操作,并对用户输入的类型做出假设。在我之前的一篇文章《像测试人员一样思考》中,我讨论了在国际化和本地化测试的背景下,测试人员应具备的用户同理心。来自世界各地不同地区的用户可能需要Unicode支持来准确完成以他们母语书写的表格。我们需要测试的内容包括对多种语言的支持、不同的时区、不同的数字格式、不同格式的文本(从左到右 vs 从右到左)等。
后退按钮
Android Activity的默认行为假设用户按下“返回”键时没有期望回到同一实例的活动。移动开发者可以根据其应用程序的具体需求和规格对这一场景进行定制。无论我们选择哪种设计/开发应用程序的方式,都要确保测试系统“返回”行为不会给用户带来不适。
Android 生命周期中断
一个实现不当的Android Activity生命周期可能会导致以下结果:
如果用户在使用我们的应用程序时接到电话或切换到其他应用程序,可能会出现崩溃。
当用户没有主动使用时,占用宝贵的系统资源。
如果用户离开我们的应用并在稍后返回,则会丢失他们的进度。
当屏幕在纵向和横向方向之间旋转时,导致程序崩溃或丢失用户的进度。
将电池测试与生命周期中断测试结合起来可能很有用,这样可以观察到在应用程序中触发大量中断和用户输入时电池的使用情况。
测试Android应用程序
Android Activity 是我们应用程序中用户交互的容器,因此在设备级事件(如以下事件)期间测试应用程序的活动行为非常重要:
另一个应用程序,比如设备上的电话应用,会打断我们应用程序的活动。
该系统摧毁并重构了我们的活动。
用户可以在新的窗口环境中打开我们的活动,例如画中画(PIP)或多窗口。
尤其是,确保我们的活动在理解活动生命周期中所描述的事件时能够正确地响应是非常重要的。
不同的事件,有些是用户触发的,有些是系统触发的,可以导致Activity从一个状态转换到另一个状态。《Activity状态转换》文档描述了此类转换的常见情况,以及如何处理这些转换。
Android平台上的手动和程序中断测试
性能、稳定性、用户场景
压力测试和中断测试是移动测试过程中的重要部分。借助工具,移动测试人员可以确定应用程序是否存在任何潜在的性能或稳定性问题。为了测试我们的应用程序对中断的响应,可以在使用应用程序时手动触发大量通知到设备上。通知可以是收到的消息、来电、应用程序更新或推送通知(软件中断)。此外,按下音量键上下或其他任何硬件按钮也是一种中断(硬件中断),也会对我们的应用程序产生影响。
减轻手工测试的负担
手动完成所有这些任务需要耗费大量时间和精力。通常情况下,这些测试用例无法手动完成,因为很难用一只或两只手模拟快速且多用户的输入。但是,借助工具就可以完成这些任务,而且很容易将它们集成到开发和测试过程中。
使用ADB做Monkey测试
对于Android应用,可以使用名为Monkey的工具,它是Android SDK(软件开发工具包)的一部分。Monkey可以在物理设备或模拟器上运行。运行时,它会生成随机的用户事件,如触摸、点击、旋转、滑动、静音、断开网络连接等,以对应用进行压力测试,并查看应用如何处理这些输入和中断。
要运行Monkey,需要Android .apk文件的包名。否则,它将执行随机命令以控制整个手机。当包名(在此示例中为 com.appiumpro.the_app )可用时,使用 adb (Android调试桥)运行Monkey:
adb shell monkey -p com.appiumpro.the_app -v 2000
数字 2000 表示 Monkey 将要执行的随机命令的数量。通过添加参数 -s (用于设置种子),Monkey 可以再次生成相同的事件序列。这对于重现运行 Monkey 时可能出现的 bug 非常重要。
猴子工具可以轻松地对移动应用程序进行压力测试和中断测试。这对移动测试人员来说很有帮助,因为它有助于团队构建可靠且健壮的移动应用程序。
使用Appium自动化Android应用程序交互
性能指标
Appium的“执行脚本重载”功能允许我们自动化几乎所有类型的Android调试桥命令。在我之前的一篇文章中,我在“Shell Interactions”部分讨论了自动化ADB shell命令,例如 dumpsys battery 、 cpuinfo 和 meminfo 。
网络环境
使用b0
函数,我们可以进一步利用Android shell进行网络测试。例如,我们可以将ADB命令作为参数传递给b1
WebDriver函数。下面的命令可以打开和关闭移动网络和WiFi服务:
adb shell svc data enable
adb shell svc data disable
adb shell svc wifi enable
adb shell svc wifi disable
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取