MonkeyTalk 很多功能都可以通过 Ant 实现,这就为接入类似 Jenkins 这样的持续集成服务提供了方便。在我们下载的 MonkeyTalk Professional zip 包中有一个 Ant 库,这个库提供了执行 MonkeyTalk 脚本,动态安装 Agents 以及 App 控制的功能。我们把这些功能集成到 Jenkins 平台上,就可以构建一套完整的自动化测试体系。
在我们的 MonkeyTalk 集成开发环境中,有一个动态安装 MonkeyTalk Agent 的功能,该功能可以非常简单地将 MonkeyTalk Agent 注入到我们的被测 App 中。但这个功能仅限于 Android 应用程序才能使用。同样,该功能也可以通过 Ant 方式来实现。下面是一个 Ant 脚本的实例:
<?xml version="1.0" encoding="UTF-8"?>
<project name="sample" xmlns:mt="antlib:com.gorillalogic.monkeytalk.ant">
<target name="instru">
<mt:instrument
src="/path/to/MyApp.apk"
dest="/path/to/MyApp-Instrumented.apk"
agent="/path/to/monkeytalk-agent-2.0.2.jar"
androidSdk="/path/to/android-sdk"
androidTarget="android-19"
log="log.txt"
verbose="true" />
</target>
</project>
上面这个脚本中最重要的两个属性是 src 和 dest,分别用来定义未加 Agent 的 apk 的位置和加了 agent 后的 apk 的位置。需要注意的是,这种方式虽然对大部分基于 Eclipse 工程的 apk 有效,但对于特别复杂的 apk,还是可能失败。
将上述脚本保存为 build.xml,然后你就可以在命令行中运行它了。
ant -lib /path/to/monkeytalkpro-ant-2.0.2.beta.jar instru
将 MonkeyTalk 任务包含进来的最简单的方式是使用-lib 标志,后面跟上 Monkeytalk-client.jar 的路径,然后在命令行中调用 Ant 命令执行。除了上面说的 src 和 dest 两个参数,Ant 打包任务还可以定义其他参数,列表如下:
参数 | 描述 | 是否必须? |
---|---|---|
src | 未 instrumented 的 app | 是 |
dest | instrument 后的 app 存放的位置 | 是 |
androidsdk | Android SDK 的路径 | 是 |
agent | 用来打包的 MonkeyTalk agents 的路径 | 是 |
androidTarget | 用来打包的 Android target 的版本 | 否 |
log | log 文件的路径 | 否 |
verbose | 详细日志的路径,默认为 false | 否 |
Monkeytalk 专业版提供对 Android app 的控制,可以对被测 app 进行安装,卸载等操作。同样,Monkeytalk 专业版的 Ant 库也包含一个 App 任务用来对待测 app 进行管控。该 task 主要包含安装,卸载,启动,停止,重启等功能。目前只支持 Android 应用程序。下面是一个控制脚本的实例:
<?xml version="1.0" encoding="UTF-8"?>
<project name="sample" xmlns:mt="antlib:com.gorillalogic.monkeytalk.ant">
<property name="sdk.dir" value="/path/to/android-sdk" />
<property name="packageName" value="com.example.myapp" />
<property name="activityName" value="RootActivity" />
<target name="install">
<mt:app action="install"
binary="Out.apk"
androidSdk="${sdk.dir}"
verbose="true" />
</target>
<target name="uninstall">
<mt:app action="uninstall"
packageName="${packageName}"
androidSdk="${sdk.dir}"
verbose="true" />
</target>
<target name="launch">
<mt:app action="launch"
packageName="${packageName}"
activityName="${activityName}"
androidSdk="${sdk.dir}"
verbose="true" />
</target>
<target name="restart">
<mt:app action="relaunch"
packageName="${packageName}"
activityName="${activityName}"
androidSdk="${sdk.dir}"
verbose="true" />
</target>
<target name="stop">
<mt:app action="stop"
packageName="${packageName}"
androidSdk="${sdk.dir}"
verbose="true" />
</target>
<target name="isInstalled">
<mt:app action="isInstalled"
packageName="${packageName}"
androidSdk="${sdk.dir}"
verbose="true" />
<echoproperties prefix="monkeytalk" />
</target>
<target name="isRunning">
<mt:app action="isRunning"
packageName="${packageName}"
androidSdk="${sdk.dir}"
verbose="true" />
<echoproperties prefix="monkeytalk" />
</target>
</project>
上面的脚本只是一个练习示例,包含一些简单的 app 控制操作。在持续集成过程中,我们经常需要包含一系列的卸载,安装,重启,运行 monkeytalk 测试用例的操作。App 任务主要包含下面几个参数:
参数 | 描述 | 是否必须? |
---|---|---|
action | 对 app 执行的控制操作: install, uninstall, launch, stop, restart, info, isInstalled, isRunning | 是 |
os | 目标系统,目前只支持 Android | 否 |
androidSDK | Android SDK 的路径 | 是 |
binary | 被测 app 的路径,在调用 install 命令时要用到 | 是 |
packageName | Android 应用程序的包名 | 是 |
activityName | 要被启动的 Activity 的名称 | 是 |
deviceSerial | 设备序列号,用来指定操作的设备 | 是 |
verbose | 记录详细日志 | 否 |
当我们在 Jenkins 中运行测试用例的时候,需要把上面所有的 Ant 任务联合在一起执行,同时还需要加上一个 MonkeyTalk Run 任务,这个任务是用来执行测试用例的,单独放在一个 Ant 脚本中。下面是一个典型的用来集成到 Jenkins 的 Ant 脚本的示例:
<?xml version="1.0" encoding="UTF-8"?>
<project name="sample" xmlns:mt="antlib:com.gorillalogic.monkeytalk.ant">
<property name="sdk.dir" value="/path/to/android-sdk" />
<property name="instrumentedApp" value="/path/to/MyApp-Instrumented.apk" />
<property name="packageName" value="com.example.myapp" />
<property name="activityName" value="RootActivity" />
<target name="instru">
<mt:instrument
src="/path/to/MyApp.apk"
dest="${instrumentedApp}"
agent="/path/to/monkeytalk-agent-2.0.2.jar"
androidSdk="${sdk.dir}" />
</target>
<target name="uninstall">
<mt:app action="uninstall"
packageName="${packageName}"
androidSdk="${sdk.dir}"
verbose="true" />
</target>
<target name="install">
<mt:app action="install"
binary="${instrumentedApp}"
androidSdk="${sdk.dir}"
verbose="true" />
</target>
<target name="launch">
<mt:app action="launch"
packageName="${packageName}"
activityName="${activityName}"
androidSdk="${sdk.dir}"
verbose="true" />
</target>
<target name="test">
<mt:run
agent="AndroidEmulator"
adb="${sdk.dir}/platform-tools/adb"
thinktime="1000"
timeout="10000"
suite="${basedir}/mysuite.mts"
reportdir="${basedir}/myreports"
startup="30"
verbose="true" />
</target>
<target name="all">
<antcall target="instru" />
<antcall target="uninstall" />
<antcall target="install" />
<antcall target="launch" />
<antcall target="test" />
<antcall target="uninstall" />
</target>
</project>
上面脚本中的 all 目标是表示执行所有任务的意思,首先安装 agent 到 app,然后卸载确保设备环境清空,然后再重新安装 app 到设备,并启动待测 app,接下来运行 MonkeyTalk 测试用例,最后,我们再次卸载 app 清空测试环境。需要注意的是,上面的这些操作目前都只支持 Android 系统。
你可以通过运行下面的命令行来运行该 ant 脚本:
ant -lib /path/to/monkeytalkpro-ant-2.0.2.beta.jar all
在做持续集成的时候,建议先在模拟器上实验,通过之后再连接到真机。另外,最好是使用 Jenkins 自带的模拟器,而不是自己去创建一个模拟器。