MonkeyTalk Java API 使用教程

来源:互联网 发布:尼姆连森 知乎 编辑:程序博客网 时间:2024/06/05 15:35

MonkeyTalk简介

简单来说,MonkeyTalk是一个移动端的自动化测试框架,支持Android,iOS,Webapp的功能自动化测试。用户既可以使用MonkeyTalk集成开发环境进行测试步骤的录制回放,也可以使用Java API编写测试脚本进行自动化测试。详细介绍可以参考访问MonkeyTalk的官方网站。这里,我们主要介绍如何使用MonkeyTalk的Java API进行自动化测试。

前提知识

使用MonkeyTalk Java API要求你熟悉Java开发和Junit测试。

使用指导

首先你需要下载一个MonkeyTalk的开发包,并从其中的Java目录下提取出monkeytalk-java-all-in-one.jar文件。这个架包包含了MonkeyTalk的Java API和一起其他需要用到的架包。
然后,你可以在你Eclipse或者Android studio等你熟悉的开发环境中建立一个java工程,并将上述架包连同Junit一起导入到工程中。下图是一个Eclipse中工程目录的截图。

此处输入图片的描述

接下来,我们建立一个测试工程,下面是一个基于MonkeyTalk API编写的自动化测试脚本。

import java.io.File;import java.io.IOException;import org.junit.Before;import org.junit.BeforeClass;import org.junit.Test;import com.gorillalogic.monkeytalk.java.MonkeyTalkDriver;import com.gorillalogic.monkeytalk.java.api.Application;public class LoginTest {    private static MonkeyTalkDriver mt;    private Application app;    @BeforeClass    public static void beforeClass() throws IOException {        mt = new MonkeyTalkDriver(new File("."), "iOS");        mt.setThinktime(500);        mt.setTimeout(5000);    }    @Before    public void before() {        app = mt.app();    }    @Test    public void testLogin() {        app.input("username").enterText("fred");        app.input("password").enterText("pass");        app.button("LOGIN").tap();    }}

@BeforeClass的注解方法中,我们启动MonkeyTalkDriver并连接到一个iOS设备上app。在@Before的注解方法中,我们获取被测的应用程序。然后我们在test方法中编写测试步骤的脚本。接下来我们就可以通过Junit运行我们的测试代码。在Eclipse中,右键点击*Run As > JUnit Test*即可运行。当然,在此之前你要在手机或者模拟器上启动你的待测app。

此处输入图片的描述

关于MonkeyTalkDriver

Monkeytalk类开启了一个连接电脑和运行在移动设备上的被测app的接入点。我们可以通过如下的方式配置连接的设备类型。

MonkeyTalkDriver mt = new MonkeyTalkDriver(new File("."), "iOS");

第一个参数是保存截屏或者外包脚本的目录。第二个参数是agent的类型,可以是iOS(对于真机和模拟器),Android(对于通过wifi连接的真机),AndroidEmulator(对于模拟器或者usb连接的真机)。
如果是通过iOS真机连接测试,你必须保证你的设备和电脑在同一个wifi网段上可以通过如下的方式连接:

MonkeyTalkDriver mt = new MonkeyTalkDriver(new File("."), "iOS", "123.456.78.90");

如果是运行在Android真机上的应用程序,我们可以通过下面的方式连接:

MonkeyTalkDriver mt = new MonkeyTalkDriver(new File("."), "AndroidEmulator");mt.setAdb(new File("/path/to/android-sdk/platform-tools/adb"));

当然,MonkeyTalk driver也可以设置其他属性,如timeout或者thinktime。

mt.setTimeout(5000);mt.setThinktime(750);

最后,我们设置一个待测app的入口

Application app = mt.app();

上面的命令初始化了一个待测app的MonkeyTalk连接,因此这部分代码通常放在@Before注解函数中。另一方面,MonkeyTalkDriver在每个测试集中只需要创建一次即可,因此,我们通常将其在@BeforeClass中初始化为一个静态方法。

如何查找MonkeyId

在开始写测试脚本之前,我们先要找到一个UI元素的ID,才能对其进行操作。我们可以通过MonkeyTalk IDE进行录制获取元素ID,也可以通过IDE的Component Tree视图查看当前屏幕的控件树。或者你还可以直接在程序源代码中寻找。根据我的经验,一般第一种方式会更快捷,在这里推荐下。

Action的用法

Action顾名思义是指控件的动作,当我们通过MonkeyId找到一个控件之后,就可以通过Action来指定对该控件的动作,从而完成相应的交互事件。比如我们想要从app中获取页面元素的关键数据来判断是否正确,或者用于后续的操作。这个功能我们可以通过get方法来实现,举个例子,我们获取一个label中显示的文本:

String val = app.label("title").get();

这样,label中的文本就复制给了一个Java变量val,我们可以通过verify方法来判定它:

String val = app.label("title").get();assertThat(val, is("My Title"));

我们也可以将它的值传入其他方法:

String val = app.label("title").get();app.input("description").enterText("The title is: " + val.toLowerCase());

Modifiers的用法

每个java API的action方法,像tap(),enterText(),都可以接受一个map形式的modifiers作为参数。Java API提供一个Mods类来辅助生成该map:

Map<String,String> mods = new Mods.Builder().timeout(3500).thinktime(1000).build();Map<String,String> mods = Mods.of(Mods.TIMEOUT, "3500", Mods.THINKTIME, "1000");

如何生成报告

Java API本身不支持生成报告,但Junit可以用ant等生成xml报告。对于自定义报告,MonkeyTalk Java API提供了一些回调函数,供每个脚本开始或结束的时候调用。具体实现方法,我们可以通过重写一个PlaybackListener接口来实现:

private static StringBuilder report;@BeforeClasspublic static void beforeClass() throws IOException {    mt = new MonkeyTalkDriver(new File("."), "iOS");    mt.setThinktime(250);    mt.setTimeout(5000);    mt.setScriptListener(new PlaybackListener() {        @Override        public void onScriptStart(Scope scope) {            //ignore        }        @Override        public void onScriptComplete(Scope scope, PlaybackResult r) {            //ignore        }        @Override        public void onStart(Scope scope) {            report.append(scope.getCurrentCommand());        }        @Override        public void onComplete(Scope scope, Response resp) {            report.append("--").append(resp.getStatus());            if (resp.getMessage() != null) {                report.append("[").append(resp.getMessage()).append("]");            }            report.append('\n');        }        @Override        public void onPrint(String message) {            //ignore        }    });    report = new StringBuilder("---" + new Date() + "---\n");}@AfterClasspublic static void afterClass() throws IOException {    File rpt = new File("custom_report.txt");    Writer out = new OutputStreamWriter(new FileOutputStream(rpt), "UTF-8");    try {        out.write(report.toString());    } finally {        out.close();    }}

Raw MonkeyTalk

Java API还提供了一个raw()方法用来直接调用MonkeyTalk的命令:

app.raw("Button LOGIN Tap %timeout=123");

总结

上面简单的介绍了Junit中调用MonkeyTalk Java API进行测试的方法,以及介绍了一些API的用法。如果想要了解完整API的介绍和用法,请参考MonkeyTalk Java API的官方文档。

0 1
原创粉丝点击