MonkeyTalk MonkeyTalk 自动化持续集成方案

Haibo · 2015年09月13日 · 最后由 Haibo 回复于 2015年09月13日 · 2535 次阅读
本帖已被设为精华帖!

MonkeyTalk 很多功能都可以通过 Ant 实现,这就为接入类似 Jenkins 这样的持续集成服务提供了方便。在我们下载的 MonkeyTalk Professional zip 包中有一个 Ant 库,这个库提供了执行 MonkeyTalk 脚本,动态安装 Agents 以及 App 控制的功能。我们把这些功能集成到 Jenkins 平台上,就可以构建一套完整的自动化测试体系。

动态安装 MonkeyTalk Agent

在我们的 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

App 控制

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 持续集成服务

当我们在 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 自带的模拟器,而不是自己去创建一个模拟器。

共收到 3 条回复 时间 点赞

PowerfulAPI

Hi,我们建立了一个 wiki 作为近期 MonkeyTalk 文章的合集:
https://testerhome.com/wiki/monkeytalk

能否在更新文章的同时更新一下这个合集,并把这个合集的地址附在文章开头,方便大家查看和浏览?
谢谢!

Haibo MonkeyTalk Java API 使用教程 中提及了此贴 06月26日 17:51
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册