例如,我最近测试了一个产品,在这个产品中的移动APP会跟连接的机器产生会话。这两个设备各种各样的状态给测试场景的设计带来了特别大的挑战。下面给大家介绍一个很有用的物联网产品测试框架——物联网测试地图,它可以帮助我们管理物联网设备多种排列的复杂状态。
物联网测试因素
当我们测试简单的web应用时,通常要考虑的状态有:
- 服务器宕机
- HTTP请求超时
- 网速慢
- 授权和认证错误
测试任何互联网应用的时候,需要警惕这四种状态。对于移动应用,操作的是移动环境,需要关注额外的几种情况:
- 离线模式
- 在线模式
- 杀掉Activity
- 后台行为
- 语言
- 地理位置
我们再看“连接的机器”所带来的状态多样性,通常还有:
- 机器WiFi断开
- 机器WiFi连接
- 机器繁忙
- 机器休眠
这意味着即使只有上述给定的状态集,整个系统在任何时间点上可能会有96(4x6x4)种状态。
由于系统中状态转换会引入附加的约束,这些状态都不能当做独立的实体。例如,状态从“离线”变成“在线”很可能触发一系列的事件。
上述因素还仅仅是冰山一角。随着对规范的深入了解,把不同的状态跟逻辑场景结合起来将会更加的复杂。
对于静态系统的可变数据集,已有的web测试技术可以很好的用来抽取测试场景,比如all pairs(开源的配对测试工具)、等价类划分、边界值分析法等。这些技术通过淘汰的逻辑来优化测试数据集。
例如,all pairs技术会淘汰重复的数据配对组合。但是,对系统的可变状态设计测试场景时,这些技术是不可靠的,废弃的系统状态会使得系统通讯不畅。当然,这些技术对于物联网系统中的单个单元还是很适用的。
因此,非常有必要搞一个物联网测试地图。
可视化地图
大家肯定都在地理课上看过地图。但我这里所说的地图是针对测试场景的,它列出所有潜在的系统因素,在测试某个特性时可以从中抽取必要的测试场景。
产品的每个系统的n种状态在同一个可转动的圆环中列出,逻辑上相邻的状态在环中相互挨着。非功能需求(NFR)在测试复杂集成的时候很容易被忽略掉,于是把它们在一个环中单独列出。
下图就是我所说的物联网测试地图:
下面以一个例子介绍地图的使用场景,该例子仅涉及移动设备和机器交互部分,需要关注的环是设备、机器和网络。
把移动设备和机器固定在WiFi连接的状态,转动网络环,可以得到下面这些场景:
- 未授权用户尝试访问机器会在App上触发“访问被拒绝”的错误消息
- 服务器宕机和服务器错误会触发相应的业务错误消息——“程序出错,请稍后重试”
- 响应超时可能有两种情形:重发同一个请求并显示“正在加载”图示,或者显示上面那样相似的错误消息
- 非法请求会触发消息“请更新你的App”
继续保持移动设备的WiFi为连接状态,转动机器环:
- 当机器是离线模式的时候,App应该显示“请检查机器的网络连接”
- 当机器繁忙的时候,弹出警告“机器繁忙,无法完成请求”
- 当机器休眠或者在另一个网络上的时候,应该显示“没找到机器”等类似的消息
- 然后,机器调到正确的网络,应该恢复移动设备和机器的连接
切换机器环为WiFi连接,转动移动设备环:
- 当移动设备离线时,应该弹出对应的消息或者禁掉操作按钮
- 当移动设备恢复在线模式时,App应该发送相应的请求去连接机器
- 当移动设备的网络从WiFi切换到3G,应该有什么样的行为?
- 当用户正在试图连接物联网设备的时候突然接到电话,将App置于后台运行,这时候还能收到完整的请求还是需要从头开始发送请求?
- 安卓设备杀掉一个在后台运行了一段时间的App,用户的最后屏幕状态还会保存吗?
- 有本地化需求的App要在每个场景层面进行验证
就这样,多次旋转地图可以扩展产生多个场景。尽管有些场景可能不适合当前的特性,有些甚至跟业务需求无关,这个测试地图还是非常详尽的。
在实践层面,对于有多个QA在测试同一个物联网产品的团队,地图可以作为大家共同参考的手册。这个地图把工具、设备、场景和协议的排列以易于理解的方式呈现出来,覆盖了测试场景设计这个独特的需求,是一种非常高效的合作方式。