手机自动化测试工具实现

手机自动化测试工具实现

一、PC 端监控工具实现

1、手机自动化可解决的问题
( 1 ) 压力测试:一些连续不断的操作,比如反复切换歌曲播放及联网操作等
( 2 ) 极限临界测试:一些极限条件的构造(创建多个列表)及输入字符个数等
( 3 ) 兼容及中断:比如在播放或下载歌曲的时候来电话或者信息(动态交互)
( 4 ) 基本功能回归测试:这样大大的节约了时间和人力成本
( 5 ) 预测试(版本接收测试)
( 6 ) 专项测试

2、实现原理
(1) 手 机 自 动 化 测 试 的 原 理 为 PC 上 一 个 控 制 端 ( 测 试 工 具 ) 与 手 机 上 的 一 个agent 端,通过串口、USB 或者无线方式将 PC 与手机终端相连,然后应用测试工具向手机发送请求或者命令,手机收到命令或者请求后,交给 agent 端解析,然后 agent 将这些解析的命令下发给手机的各个功能模块所能识别的命令,调用那些功能模块模拟操作。完成这些操作后,手机会返回一些信息,agent 可以抓取这些信息,然后传回给 PC 端,这样就完成了一个完整的手机自动化测试。
(2) 关键点在于 agent,可以利用 MMI_Command(AT comand)的方式来控制手机终端,原理就是给手机提供一个响应的接口。
(3) 而对于 PC 控制端,这个测试脚本用各种编程语言都可以,看如何定义。
手机自动化测试工具实现_第1张图片

3、TMTS 的 PC 端框架架(agent)说明

为什么需要 PC 端框架

单单依靠 Instrumentation 无法满足跨应用测试的需求
一些功能,如在测试用例中修改服务器端数据库,很难在移动设备端实现

PC 端框架的原理

PC 端运行时,会不停尝试去连接 PC 本地指定端口,由于执行了 adb

forward 命令(所以要求运行测试的设备都是具有 root 权限的),PC 端实际会去连接移动设备端指定端口

移动设备端框架在运行时会启动一个 ServerSocket,监听来自 PC 端的

Socket 请求

移动设备端发送 athrun 自定义格式的命令至 PC 端,PC 端收到后收到后

会解析命令,然后执行具体的操作,将结果再通过 socket 发送至移动设备端

PC 端目前提供的功能

首先以下功能的 API 都在 framework 中提供,agent 只是负责实现这些功

通过 Android 系统中 monkey 去点击屏幕上一个点或是物理按键(目前建立与 monkey 的通信机制,暂提供这两项操作,可根据自身需求进行扩展)
修改服务器端(android 应用是客户端)的数据
在模拟器上模拟来电,模拟短信

二、关键技术实现

1、消息传送机制
利用手机 Modem 中提供的 AT Command 通过串口向手机端建立命令消息通讯,目前手机厂商提供了常用的 AT Command,基本满足普通的自动化测试需求。

2、图像识别
图像识别主要通过抓取 LCD 屏幕显示图像进行智能识别来模拟测试工程师的双眼辨识文字或图像信息,以此判断测试结果。主要涉及图像的获取和对比分析,智能识别是一个比较专业的研究领域,更进一步的研究需要进行调研,目前我们可以考虑是否能够通过第三方工具来实现,比如借助目前已经成熟的测试工具QTP 等。对于图像获取在手机平台上应该具备这样的接口,或者自行开发这个接口。

3、测试脚本

测试脚本的定义:
通常来说,测试脚本就是被测试工具执行的一系列指令,而不是在被测系统上执行的指令。测试脚本一般通过脚本开发人员编写或者录制脚本工具录制。拿我所用的手机自动化测试工具举例来说,被测试工具执行的是 python 脚本,而手机是用 C 开发的。最后发给手机执行的命令是通过手机 server 对测试工具发来的消息的解析。

测试脚本相关技术的目的
知道了什么是测试脚本之后,我觉得下一步应该去想一想为什么要去探讨这些技术,这些技术又给测试脚本带来了哪些好处。
关于上面的两个问题,我们首先得知道与测试脚本相关的两大活动。第一个是开发,另一个是维护。这两个活动都跟时间成正比,测试脚本的好,复杂,维护少,开发周期长;测试脚本简单,开发周期短,维护周期长。它们之间的关系可以用如下图来表示:
手机自动化测试工具实现_第2张图片

那么把开发
脚本作为一个工程来讲的话,我们就希望用最少的时间及最少的成本去做这两件事。使开发和维护达到一个最佳值。如此,我们探讨测试脚本技术的目的也就出来了,就是减少自动化测试脚本开发和维护的成本。
好的测试脚本的特性既然我们知道了运用测试脚本技术的目的,那么为了达到这个目标我们就要把其具体化。那下面我们就来罗列一下好的测试脚本应该具有的特性。
1. 可维护性
2. 模块化
3. 健壮性
4. 复用性

接下来我们要谈的关于测试脚本的关键技术就是为了使测试脚本具有以上这些
特性。
测试脚本关键技术
下面我会以所用到的手机自动化测试工具为例,讲解一个最原始的”脚本”
如何运用这些技术对脚本进行封装和设计使其演变成一个高级的好的测试脚本 。
首先我们来看看最原始的脚本使个什么样子,你可以这样理解,它是最后运
行在被测软件上的那段代码,严格上来说,它都不能被称为脚本,所以我给加上
引号。就那我所用的手机测试工具来说吧,最原始的脚本就是一个自定义的 xml
结构的消息。xml 结构通常如下,

<teststep>
<key_input_sequence>
<key/>
key_input_sequence>
<expect>
<display/>
expect>
teststep>

上 面 的 xml 消 息 由 自 动 化 测 试 工 具 的 客 户 端 通 过 usb 数 据 线 发 给 手 机 的 test

server 端,test server 端对消息进行解析,然后再由 Server 端发给相关 Server 。
这些相关 Server 在这里通常是 keyboard server 和 window server. Keyboard
server 通 常对 接受 到的 按键序列 进行 响应,test server 会 从 Window server
获得手机的 UI 信息并和 expect 的值进行对比。
现在我们就要对这个最原始的脚本进行设计和封装。
1.线性脚本
线性脚本是我们对最原始的脚本的第一次封装,线性脚本就是简单的测试脚本,形象的来定义就是我们通常录制手工测试用例得到的脚本,这些脚本由低层次的一些函数组成,这些低层次的函数通常由测试框架来提供。他们通常提供按键,移动,输入数据,比较数据的功能。比如笔者的手机自动化测试工具所提供的相关函数有 pressKey(),expectText(),
expectAnimation(),expectBitmap()函数。通过线性脚本使我们远离了编写 xml消息的繁杂,我们只需根据测试用例录制脚本就能完成测试脚本的编写,这迈出了自动化测试脚本编写的第一步,我们来看看线性脚本的特点。

简单,开发周期短
没有逻辑判断,也就是说编程语言中的控制语句 if,else,while
可维护性差,脚本很差,只要 case 发生一点变化,就要进行重新录制
没有复用性

让我们用好的测试脚本所具备的特点来判断,基本都不符合。所以线性脚本不是我们最终所追求的脚本,我们还需继续努力。

2.结构化脚本
自动化脚本的价值体现在脚本的复用,复用的次数越多,价值也就越大。为了提高脚本的复用性,引用了结构化设计的脚本。结构化脚本就是在原有线性脚本的基础上增加了各种逻辑结构,包括选择性结构,分支结构,循环迭代结构,还具有函数调用功能。这样就可以使脚本模块化,使脚本具有复用性,维护性也得到了提高。但依然存在问题,比如,测试数据和测试逻辑混在一起,相当于测试数据硬编码在脚本中,于是我们引入了数据驱动这个技术。
3.数据驱动脚本
结构脚本健壮性已经很好了,但是缺点还是有的,通过研究测试用例一般分为测试数据和测试逻辑。就能发现结构化脚本没有把这两个分开,测试数据还是和测试逻辑黏在一起,这样就会给维护带来复杂性,比如,我们只想改改测试数据,我们不得不去动测试逻辑相关的脚本。这样就很可能会无意中破坏测试逻辑。如果把两者分开,则可以保证两者的修改无不影响。这样对 tester 来说修改测试数据就变的容易了,而不需要去懂脚本相关的知识。另外数据驱动脚本也进一步提高了脚本的复用性,尤其是对那些只需改动测试数据的测试用例,测试逻辑脚本得到了复用。而在原来的结构化脚本是不行的。其实数据驱动这项技术不仅在测试中用到,在开发中也在用,就比如 web 开发,html 语言,wpf 的 xaml,moziila
的 xul 等的一些 xml 方式的界面开发都应该是数据驱动的。笔者的自动化测试工具就是用的 xml 来定义测试数据,然后通过对 xml 的解析来导入所需的数据从而建立相关的测试模型。
4.关键字驱动脚本

关键字 驱动 就是 面向脚本 开发工程师和 tester.使 他们编写 脚本 和阅 读脚 本更加容易。就拿笔者使用的测试工具来说吧,比如要通过手机的 option 选项来选择 option 菜 单 中 的 某 一 项 , 如 果 不 用 关 键 字 驱 动 脚 本 , 我 们 就 会 写 一 大 堆pressKey()的按键序列,来让手机执行这些按键命令,这样对 tester 就很不友好,这些按键序列其实应该是面向机器的。如果用了关键字驱动脚本,我们会提供 select 关键字,然后提供 item 参数。加入关键字驱动技术后,同样实现这
个功能,只需调用函数 select(item)即可,这样既利于脚本编写,也利于维护。
因为,从维护的角度来看,你只需要维护 select(item)这个方法。
这些技术都不是各自独立存在的,是相互共存的。讲完了这些测试脚本技术,那么我们可以对测试脚本语言的选择有一些了解。为了实现这些测试脚本技术,我们的脚本语言一定要扩展性好,那么自己定制的测试脚本语言在扩展性方面就比较差,所以我们要选择标准的测试脚本语言,比如 python,vb,tcl,ruby.它们的扩展性好,功能强大,能良好的与开发人员进行沟通。

你可能感兴趣的:(自动化测试)