Macaca-Java版入门指南

导语

接触Macaca已经有一段时间,从开始的对于UI自动化的调研开始,将Macaca与Appium,Robotium等自动化方案进行了多方对比,最终Macaca脱颖而出成为团队的敲定方案,随后经历了Macaca从JS版本到Java版本的迭代,踩了很多坑,积累了很多经验教训,在这里总结沉淀一下,以方便后来人少走弯路,加快脚步。

一、认识Macaca



Macaca是一套基于WebDriver标准协议开发的开源自动化解决方案,旨在解决跨平台,跨终端的UI自动化测试的短板问题,减少繁杂、重复的人工工作,降低自动化测试的上手门坎。终端上,Macaca同时支持Native(iOS&&Android)、Hybrid、Mobile Web、以及PC端的自动化测试,用例编写上,Macaca采取CS架构,可以支持任意编程语言的封装,目前已支持Javascript、Java、Python三种语言,感兴趣的同学甚至可以自行封装支持任意自己习惯的语言。目前,Macaca在testerHome上的关注度以及活跃度都保持着强劲的势头,他不只提供了基础的用例编写功能,更提供了性能数据,包含电量、内存等指标的采集功能的附带模块,以及一套分布式持续集成系统供有需者选择,选择Macaca作为UI自动化的框架,将为大家提供很大的便利性。

二、配置Macaca开发环境



首先要讲的是Macaca对于系统环境的依赖,因为执行iOS平台的自动化测试需要依赖于Mac系统的XCode工具,因此对于实践Macaca的同学来说,建议使用Mac系统,Windows系统也可以用,但受限于XCode工具,Windows系统上无法支持iOS平台的测试,对于Android、PC等的测试则不受影响。

具体的环境配置可以参考:Macaca官方教程

简易安装步骤如下:

基础环境准备

  1. 安装Node.js 要求v4.0及以上(据说v7.0的也不行,所以建议7.0以下)
  2. XCode 要求v7.3及以上(用Mac的同学直接从AppStore安装就可以)
  3. ios-webkit-debug-proxy
        $ brew install ios-webkit-debug-proxy
  1. 安装JDK(建议下载官方下载),配置JAVA_HOME
  2. 安装ANDROID SDK ,配置ANDROID_HOME
  3. 【optional】安装cnpmcnpm安装地址

解决npm因为部分依赖被墙导致安装失败的问题,当然此选项是可选项,如果大家用npm可以直接安装成功,则不用考虑这一步

安装cnpm成功后,在执行所有npm命令的时候替换为cnpm即可。
eg:

$ npm i -g macaca-cli
// 等价替换
$ cnpm i -g macaca-cli

Macaca安装

  1. 安装Macaca

        $ npm i -g macaca-cli
    
  2. 安装对应各平台的驱动ios/android/chrome/electron(Desktop应用),对于不需要的,可以跳过
        $ npm i macaca-ios -g
        $ npm i macaca-android -g
        $ npm i macaca-chrome -g
        $ npm i macaca-electron -g
    
  3. 安装app-inspector,用于控件查找
        $ npm i app-inspector -g

以上步骤执行完成后,执行macaca doctor命令进行校验,如图所示,则表示环境都准备Ok了,如果有报红色提示的,则需要对应的解决:

在此总结几条踩坑记录:

1.关于JDK版本问题,咨询过Macaca团队的同学,对于JDK的版本是没有具体要求的,之前在1.7的版本下也成功安装过,但是后期重新安装过后总是提示如下错误:

    [dx] Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/dx/command/Main : Unsupported major.minor version 52.0

经过查询,Version 52.0对应的是JDK1.8版本,于是更新本地JDK版本为1.8 问题成功解决。

2.Android SDK问题,Macaca支持Android最低版本为API18, 请注意,另外build-tool请不要安装预览版。

如果出现如下图提示,说明安卓相关环境没有配置完全,需要通过Android SDk Manager下载相应的sdk.

三、编写Macaca-Java版测试用例


1.下载官方提供的Java版Demo用例

https://github.com/macacajs/macaca-test-sample-java

2.Demo用例分析:

通过Eclipse导入Maven工程,会发现工程结构相当简单,只有一个SampleTest.java类,之所以如此简洁,是因为Demo工程将Macaca的Java源码库以Maven源的形式配置到了pom.xml中:

    <dependency>
            <groupId>macaca.webdriver.client</groupId>
            <artifactId>macacaclient</artifactId>
            <version>1.0.1</version>
    </dependency>

如上图,可知道当Macaca有更新时,可以通过修改上图中的version版本号来实现库的更新。

对SampleTest.java源码的分析:

*setUp()方法主要用于配置被测应用的基础信息,包含平台版本,系统版本,安装包路径等,Demo实例中提供的为一个PC端的实例,当配置移动端应用测试时,相关参数稍有不同,后面会给出对应移动端的setUp()配置

    @Before
    public void setUp() throws Exception {
       // 在setUp()中配置被测应用的基础信息,如平台版本,安装包地址等
        Logger logger = Logger.getLogger(getClass());
        JSONObject porps = new JSONObject();
        porps.put("autoAcceptAlerts", true);
        porps.put("browserName", "electron");
        porps.put("platformName", "desktop");
        porps.put("version", "");
        porps.put("javascriptEnabled", true);
        porps.put("platform", "ANY");
        JSONObject desiredCapabilities = new JSONObject();
        desiredCapabilities.put("desiredCapabilities", porps);
        driver.initDriver(desiredCapabilities).setWindowSize(1280, 800).get("https://www.baidu.com");
    }

*移动端的setUp()配置信息实例

        @Before
    public void setUp() throws Exception {

        JSONObject porps = new JSONObject();
        porps.put("autoAcceptAlerts", true);
        porps.put("platformVersion", "9.3");
        porps.put("deviceName", "iPhone 5s");
        porps.put("platformName", "iOS");
        // 指定待测应用的安装包
        porps.put("app", "//targetApp.zip");
        JSONObject desiredCapabilities = new JSONObject();
        desiredCapabilities.put("desiredCapabilities", porps);
        driver.initDriver(desiredCapabilities);
        driver.platform = "ios";

    }

针对如上代码,需要注意的是,对于iOS平台,app的安装包需要基于.app包压缩后的zip包,而不能用.ipa包进行压缩,对于模拟器,可以直接安装使用,但是对于真机,则需要涉及证书签名等问题,关于这个,后期会做详细介绍。
另外,对于配置参数,iOS与安卓有各自特有的参数,具体配置信息可参考:desired-caps

*测试用例编写


    @Test
    public void test_case_1() throws Exception {
        driver
            .elementById("kw")
            .sendKeys("macaca")
            .sleep(1000)
            .elementById("su")
            .click()
            .sleep(3000);

        String html = driver.source();

        Assert.assertThat(html, containsString("<html>"));

        driver
            .elementByCss("#head > div.head_wrapper")
            .elementByXPath("//*[@id=\"kw\"]")
            .sendKeys(" elementByXPath")
            .elementById("su")
            .click()
            .takeScreenshot();
    }

可能习惯Java的同学对于测试用例的这种链式写法有些不习惯,个人认为这样写与Javascript版本的迁移有所关联,优势在于可以便利的实现连续的UI操作,而不用一行行写重复样式的调用,而实现这种语法的关键在于源码中每一个接口,比如elementById(),sendKeys()都返回了driver本身,如下:

        #MacacaClient.java
        /**
     * Search for an element on the page, starting from the document root.
     * @param elementId The ID attribute of element
     * @return The currently instance of MacacaClient
     * @throws Exception
     */
    public MacacaClient elementById(String elementId) throws Exception {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("value", elementId);
        jsonObject.put("using", "id");
        element.findElement(jsonObject);
        return this;
    }

以上源码来自于Java版Source Code:https://github.com/macacajs/wd.java

3.Demo用例运行

同Javascript版用例不同的一点是,Javascript版本的用例可以直接通过一条命令启动macaca server并运行case,而Java版的用例则需要单独启动Macaca server,然后执行测试用例,具体操作如下:

1)进入工程目录
$cd path/to/macaca-test-sample-java
2)启动Macaca server
$macaca server

如果想查看启动中的详细信息 可以追加--verbose参数 $macaca server --verbose

3)新建cmd窗口,进入当前工程目录下:
$mvn -s settings.xml clean install

注:mvn -s的作用在于使maven以工程目录下的settings.xml文件为依据下载依赖,但是实践中发现部分同学会出现mvn -s无法生效的作用,这样会导致依赖下载失败,这种情况下,需要大家将工程目录下的settings.xml中的配置相应的添加到本地settings中。

$mvn test

这样就可以看到自动执行的测试效果了

四、UI控件查找工具-Inspector



实际应用中自动化用例的编写很多情况下都是查找控件并操作,于是如何快速高效的查找控件成为了一件关乎效率的大问题,最早的时候对于安卓,查找控件依赖于Android自带的UIAutomator viewer工具,iOS则依赖于XCode中的Accessibility Inspector工具,但是这两种工具查找起来相对麻烦,效率相对低下,针对这个问题,Macaca团队提供了统一的Inspector工具,可以以Web的方式方便的查看不论是安卓还是iOS的控件。

具体使用链接如下:https://macacajs.com/inspector

关于控件的查找另外补充一点,目前Java版提供通过id,css,name,xpath等方式获取控件,但xpath的方式扩展性太弱,不到万不得已不推荐使用,最好的方式是希望对每个控件能有一个唯一性的id标示获取,但这需要开发同学的配合,对于安卓,有一些控件是有id的,因为开发同学自身也需要定位这个控件,但对于iOS,有很多控件是不存在id的,但是如果有一种底层的方案,按照一定的规则给控件自动增加id属性,则只需要在底层做一定适配而不需要开发同学额外给每个控件增加id属性,这对于提高自动化的效率大有裨益,在网上找到了一篇类似思想的文章,仅供参考:为UIAutomation 添加自动化测试标签的探索

参考资料

1.macaca官方教程

官方教程包含环境搭建/API参考(Js、Java、Python)/CI集成等最权威的指南,参考首选。

2.TesterHome上的Macaca社区

testerHome上包含很多实际应用的帖子,很多步骤介绍的比较详细并配有截图,以及暴露了很多开发者使用过程中的坑,对于扫盲非常有帮助

3.Macaca源码

想深入了解Macaca原理的同学可以研究Macaca的源码,Macaca团队将每个模块单独建立了代码库,看起来清楚明了。如果在开发中遇到了框架层面的问题,也可以在对应的github上提issue,甚至可以提交PR参与到Macaca的共建中,作为开源框架,Macaca需要大家共同努力发扬光大。

时间: 2025-01-30 03:38:17

Macaca-Java版入门指南的相关文章

Apache Camel的Java编程入门指南_java

 Apache Camel是一个非常实用的规则引擎库,能够用来处理来自于不同源的事件和信息.你可以在使用不同的协议比如VM,HTTP,FTP,JMS甚至是文件系统中来传递消息,并且让你的操作逻辑和传递逻辑保持分离,这能够让你更专注于消息的内容. 在这篇文章中,我将提供一个Java语言(非Groovy)的Apache Camel入门演示. 首先创建一个Maven项目的pom.xml.   <?xml version="1.0" encoding="UTF-8"?

NetBeans IDE 6.0 Java快速入门指南

欢迎使用 NetBeans IDE! 本教程提供 NetBeans IDE 工作流程的简单介绍和快速指南.我们将指导大家创建一个简单的 "Hello World" Java 控制台应用程序.完成此教程之后,您将具备如何在 IDE 中创建.编译和运行应 用程序的基本知识. 本教程可在 10 分钟之内完成. 完成本教程之后,您可以继续学习 NetBeans IDE 的 在线文档中心.该部分提供的教程全面介绍了众 多 IDE 特性和编程技巧,可应用于各种应用程序类型.如果对 "He

Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突) (转)

本文为作者原创,转载请注明出处:http://www.cnblogs.com/gzdaijie/p/5296624.html 目录 1.添加依赖包名1.1 依赖类型1.2 声明依赖1.3 添加java依赖1.4 查找依赖包名1.5 完整的例子2.添加依赖仓库3.依赖常见问题3.1 依赖传递性3.2 版本冲突3.3 动态依赖3.4 更多设置 开发任何软件,如何管理依赖是一道绕不过去的坎,软件开发过程中,我们往往会使用这样那样的第三方库,这个时候,一个好的依赖管理就显得尤为重要了.作为一个自动构建工

针对初学者的jQuery入门指南_jquery

 jQuery 是什么,它能为我们做什么?如果你是一名 Web 开发人员,写过 JavaScript 程序,那么你很可能正在使用 jQuery,即使没有试用过,至少也听说过,事实上 jQuery 可以说是现阶段最流行的 JavaScript 库.据有关部门统计,全球网站上面,约有 28% 的网站在使用 jQuery,这个数字可能有些夸张,但足见 jQuery 受欢迎的程度.本文仅对 jQuery 的使用方法作简单介绍,且作为一个入门教程吧.下载 jQuery 代码,并在页面中载入 首先需要从jQ

《Redis入门指南(第2版)》一第3章 入门

第3章 入门 Redis入门指南(第2版) 学会如何安装和运行Redis,并了解Redis的基础知识后,本章将详细介绍Redis的5种主要数据类型及相应的命令,带领读者真正进入Redis的世界.在学习的时候,手边打开一个redis-cli程序来跟着一起输入命令将会极大地提高学习效率.尽管在目前多数公司和团队的Redis的应用是以缓存和队列为主. 在之后的章节中你会遇到两个学习伙伴:小白和宋老师.小白是一个标准的极客,最近刚开始他的Redis学习之旅,而他大学时的计算机老师宋老师恰好对Redis颇

《Redis入门指南(第2版)》一第2章 准备

第2章 准备 Redis入门指南(第2版)"纸上得来终觉浅,绝知此事要躬行." --陆游<冬夜读书示子聿> 学习Redis最好的办法就是动手尝试它.在介绍Redis最核心的内容之前,本章先来介绍一下如何安装和运行Redis,以及Redis的基础知识,使读者可以在之后的章节中一边学习一边实践.

java的if else语句入门指南(推荐)_java

条件语句,是程序中根据条件是否成立进行选择执行的一类语句,这类语句在实际使用中,难点在于如何准确的抽象条件.例如实现程序登录功能时,如果用户名和密码正确,则进入系统,否则弹出"密码错误"这样的提示框等. 本部分对于条件语句的介绍,重点在于语法讲解和基本的使用,更详细的使用参看后续的综合示例部分. 在Java语言中,条件语句主要有两类语法:if语句和switch语句. 1 .if语句 if关键字中文意思是如果,其细致的语法归纳来说总共有三种:if语句.if-else语句和if-else

《Redis入门指南(第2版)》一导读

前 言 Redis入门指南(第2版)Redis如今已经成为Web开发社区中最火热的内存数据库之一,而它的诞生距现在不过才4年.随着Web 2.0的蓬勃发展,网站数据快速增长,对高性能读写的需求也越来越多,再加上半结构化的数据比重逐渐变大,人们对早已被铺天盖地地运用着的关系数据库能否适应现今的存储需求产生了疑问.而Redis的迅猛发展,为这个领域注入了全新的思维. Redis凭借其全面的功能得到越来越多的公司的青睐,从初创企业到新浪微博这样拥有着几百台Redis服务器的大公司,都能看到Redis的

[译]函数式响应编程入门指南

本文讲的是[译]函数式响应编程入门指南, 原文地址:An Introduction to Functional Reactive Programming 原文作者:Daniel Lew 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:龙骑将杨影枫 校对者:jasonxia23.Tobias Lee 函数式响应编程入门指南 今年,我做了一场有关函数式响应编程(functional reactive programming,简称 FRP)的演讲,演讲的内容