UI自动化Macaca-Java版实践心得

简介: #### 导语 在上篇分享中,跟大家分享了[Macaca-Java版入门指南](http://www.atatech.org/articles/61699?commentId=103931&msgid=965698#comment-103931),相信很多同学已经可以依据教程开始实践UI自动化

导语

在上篇分享中,跟大家分享了Macaca-Java版入门指南,相信很多同学已经可以依据教程开始实践UI自动化工作,但入门问题解决了,要真正在业务中实践还需要面临不少挑战,这篇文章则紧接上一篇,就Macaca在业务中的实际应用给出一些经验总结,希望能给在迷茫中不知如何入手的同学们一些方向,同时欢迎大家就本篇文章中涉及的一些方案给出更优的答案,大家一起进步。

当Macaca遭遇具体业务

1. UI控件不同平台的统一处理问题

首先,我们看一下对于单个平台,是如何做控件的查找与操作的:

    //SampleTest.java
    
    public void test() throws Exception {
        driver.elementById("targetElementId"); // elment的唯一标识
        driver.click();
    }

当平台扩展为多个时,一般来讲,如何进行同一个控件的操作呢?比如对应同一个按钮,在iOS平台,我们可以知道他的name属性,但是在安卓平台,对应的同一个控件,没有name属性,需要通过id属性来获取,那代码就会演变成如下样式:

    //SampleTest.java
    public void test() throws Exception {
        if (driver.curPlatform==PlatformType.IOS)
        {
            // 如果是iOS平台,根据name属性查找控件
            driver.elementByName("targetElementName");
            driver.click();
        } else {
            // 如果是安卓平台,根据id属性查找控件
            driver.elementById("targetElementId");
            driver.click();
        }
    }

众所周知,对于UI自动化,控件的查找是使用相当频繁的一种操作,那么问题来了,有没有一种方式,可以统一控件的查找而不必通过一个接一个的if else分支来完成呢?

2. 测试稳定性问题

测试的稳定性,是影响自动化测试的另一大因素,因为移动端操作场景的复杂性,测试用例执行的过程中可能出现多种意料之外的响应,比如点击某一个按钮,预期结果是进入下一个页面,但是却弹出了某个弹框,或者真正跳转的页面并不是我们所预期的页面,或者跳转了我们所预期的页面,但因为网络数据的加载主视图并没有刷新,这样一来,针对我们的目标页面所做的操作都会失败,因为我们无法找到预期页面的目标控件,在这种情况下,我们需要在保证预期页面已经加载的情况下再执行预期流程的用例,如何做到这一点呢?

再者,长距离到达组件入口的问题也是影响自动化稳定性的另一因素,比如我们想要测试某个基金详情页,但是要进入某个详情页,必须经过登录-首页-A页面-B页面-目标页面几个必须步骤,在到达目标页面之前的任何一个链条中出现中断,这次测试就等于无效了,这种问题怎么破?

当然,影响自动化测试稳定性的场景还有很多,这些在真正的业务实践中会逐步暴露出来,如何保证自动化测试的稳定性,是自动化测试的又一个难题。

3. 测试报告输出问题

对应每一项测试流程,执行完毕之后我们都希望能看到详尽的测试报告,如何快速高效的输出可读性强的测试报告,同样是一个必须解决的问题。

4. 学习维护成本问题

自动化平台或者工具如果对环境配置、使用规范,脚本等有较复杂要求的话,那么对于入门刚刚的测试工程师来说有一定的学习成本。另外,跟随目标产品的版本迭代,自动化脚本要做对应的调整,如果对应的调整成本比较高,也很难保证将自动化的工作方式坚持下去。

我们是如何解决这些问题的

1. 如何解决不同平台的控件统一问题

研究上面的第一个问题,我们会发现控件的获取虽然根据平台不同而需要单独处理,但是控件的获取方式其实都是统一的,获取控件有两大要素,一是获取控件的方式,比如name,id,xpath,css,class name等等,二是要获取控件的值,这个值是与获取控件的方式想对应的,针对移动端测试来说,目前一般覆盖iOS,Android两个平台,我们以这个为例,其实对于UI操作上的一个控件,提供两个平台分别的获取方式以及值就可以解决控件一致性的问题,代码如下:

    // CommonUIBean.java
    
    /**
     * 当安卓 ios两个平台对应同一控件的获取方式不一致时使用本构造函数
     * @param androidBy 获取安卓对应控件的方式
     * @param androidValue 获取安卓对应控件的值
     * @param iosBy 获取ios对应控件的方式
     * @param iosValue 获取ios对应控件的值
     */
    public CommonUIBean(GetElementWay androidBy,String androidValue,GetElementWay iosBy,String iosValue){
        this.androidBy = androidBy;
        this.androidValue = androidValue;
        this.iosBy = iosBy;
        this.iosValue = iosValue;
    }
    
    /**
     * 构造函数,用于ios&android两个平台获取UI一致的情况
     * @param commonBy 统一获取控件方式
     * @param commonValue 统一获取控件值
     */
    public CommonUIBean(GetElementWay commonBy,String commonValue){
        this.androidBy = commonBy;
        this.androidValue = commonValue;
        this.iosBy = commonBy;
        this.iosValue = commonValue;
    }

如上图这样,我们就统一了控件的一次性获取问题,通过这一层封装,如果要表示跨两个平台的一个控件,就可以简化为如下这样:

    CommonUIBean targetElement = new CommonUIBean(GetElementWay.ID,"targetElementId",GetElementWay.NAME,"targetElementName");

2. 如何保证测试稳定性

1、对于要测试的页面抽象成类,增加页面是否加载成功的逻辑,所有页面内部的测试逻辑,均在确认该页面加载成功后再执行从而保证自动化稳定性。

2.对于长距离到达组件入口的问题,通过scheme跳转解决。具体来讲,对于目标页面,只要支持scheme跳转,我们可以直接通过scheme的方式从首页直接进行加载,这样可以一步到达目标页面,省略掉了前面的诸多链路,从而保证了测试的稳定性。当然,这种方式需要依赖开发同学的支持,只有在开发层面上尽可能多的支持独立页面的scheme跳转方式,才能真正使这个解决方案大放光彩。

当然,除了这些之外,对于其他分支的阻塞场景,一方面需要我们对业务复杂度的深入了解,一方面需要在今后的实践中不断积累。

3. 如何详尽的输出测试报告

对于这个问题,我们是分这么几步走的:

1.按照业务需求将错误类型进行分类整理

2.规范化结果输出的规则

3.在对应节点按照既定规则输出日志并写入文件

这样,用例执行结束后,我们就可以看到具体的执行过程以及结果了,规范化日志输出的规则还有一个好处是便于今后结果的集成展示,比如我们要通过web直观的看到执行进度以及结果的时候,就可以通过解析日志得到相应数据。

4. 学习维护成本问题

关于学习成本,就要回到我们的标题,我们这里讲的是Macaca-Java版最佳实践,其实在最早的调研阶段,我们都是通过Javascript写用例的,但是考虑到大部分同学的学习成本,所以在Macaca支持Java后,我们立即转型到Java版本上来,这样大大减小了学习成本,另外,我们在设计自己的框架的时候,设置了config配置文件来配置通用信息,比如应用信息、用户信息等都可以通过配置文件配置,对于用例编写中常用的类进行了封装,形成了一套用例编写规范,这些对于新上手的同学都降低了接入成本,甚至对于不熟悉Java的同学,都可以比较easy的比葫芦画瓢的编写自己的用例。

关于维护成本,我们对于控件的封装使控件更新的成本变低,对于Page的封装,使得同一个页面的测试入口都集中在一起,每个页面各自维护自己的操作入口,这样当我们需要测试一个流程时,只需要把经过的页面对应的操作组装到一起就可以了,当我们需要更新某一个页面的某个操作时,只需要去页面对应的类中去修改指定的操作,而不影响原有的流程化逻辑,具体请参考源码。

Demo实例

广告时间结束,正片从这里开始。

上面讲了这么多内容做铺垫,相信很多同学已经不耐烦的想要直接看源码了,好的,这就满足泥萌。不过要成功的跑起我们的测试用例来,必须保证本机已经配置好了Macaca的相关环境,还没配置的同学请参考我上一篇文章Macaca-Java版入门指南

下载源码 github地址

$ git clone https://github.com/Yinxl/bootstrap.git

更新依赖

$ cd bootstrap
$ mvn -s settings.xml clean install

如果下载依赖过程中报错,可能是由于mvn -s命令没有生效导致的,建议将根目录下settings.xml中的依赖配置到本地Maven目录下的settings.xml中。

如何修改目标平台 ios/android?

//package com.javademo.common;
// Config.java
 // 目标平台- ios android 
   public static final String PLATFORM = "ios"; 

注意:执行iOS用例时需要将XCode升级到最新的8.1,执行用例前请先启动目标模拟器。

启动server

$ macaca server --verbose

注意启动server时不能加代理,因为server在本机启动需要连接localhost,加代理会导致无法建立连接。

执行测试用例

$ mvn test 

Demo详解

如果你成功跑起来了用例,那么下一步我们就来详细研究一下Demo的源码部分了,如果你非常不幸的因为各种原因没能run起来,请先保证Macaca的环境已经正常安装(macaca-doctor),如果环境正常但还是启动失败,请毫不吝啬的联系我。

下面给出一张各package的作用讲解,在看过这部分之后相信大部分人已经基本清楚这个框架的基础结构了,然后更深入的理解,还需要大家认真去研究一下源码。
bootstrap

To Do

1. 数据驱动实现

目前的框架已经解决了一些自动化测试用例编写中的基本问题,但是在写过一定量的case后,我们会发现case的组装实际上是一种类似的逻辑:获取控件(通过多种方式) -> 对控件进行某种操作(click)->与预期结果进行对比得到case执行结果,这有限的几种,既然这些操作如此相似,那我们是不是可以通过一种数据驱动的方式更有效的进行case的管理,就像如下这张图这样:
_2016_09_23_11_24_45
最后我们期望达到的效果是建立一个管理系统,将所有的流程通过用例管理系统进行如上信息的管理,最终实现零编码的自动化用例设计,当然这其中还需要解决诸多问题,需要我们在积累编写经验的同时不断完善。也欢迎志同道合的同学们加入到这个过程中一起努力!

2. 与网络数据的结合

想象一下我们的自动化测试工作已经正常投产,然后在运行过程中我们发现了一些bug,这时候开发就需要去解决这些bug,对于开发同学,我们现在能提供的是bug出现时的屏幕截图,但是很多时候仅仅依赖一个截图是不能帮助开发同学去定位真正的问题的,如果能获取用户当时的请求和后端的返回数据,结合屏幕截图,则能大大的方便开发同学定位并解决问题,这一步要如何实现,还需要我们进一步的思考。如果这一步完成了,那么我们相当于将线上巡检与UI自动化结合在了一起,无疑是一件很有意义的大跨越。

除了网络数据,还有很多可以和UI自动化结合的点子,比如埋点,比如监控,因为UI操作是一切app行为的基础,所以从UI自动化出发,我们有很多事情可以做,有没有热血沸腾了呢?

目录
相关文章
|
16天前
|
设计模式 安全 Java
Java编程中的单例模式:理解与实践
【10月更文挑战第31天】在Java的世界里,单例模式是一种优雅的解决方案,它确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的实现方式、使用场景及其优缺点,同时提供代码示例以加深理解。无论你是Java新手还是有经验的开发者,掌握单例模式都将是你技能库中的宝贵财富。
24 2
|
8天前
|
敏捷开发 人工智能 Devops
探索自动化测试的高效策略与实践###
当今软件开发生命周期中,自动化测试已成为提升效率、保障质量的关键工具。本文深入剖析了自动化测试的核心价值,探讨了一系列高效策略,包括选择合适的自动化框架、设计可维护的测试脚本、集成持续集成/持续部署(CI/CD)流程,以及有效管理和维护测试用例库。通过具体案例分析,揭示了这些策略在实际应用中的成效,为软件测试人员提供了宝贵的经验分享和实践指导。 ###
|
7天前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
8天前
|
Java 测试技术 持续交付
探索自动化测试在软件开发中的关键作用与实践
在现代软件开发流程中,自动化测试已成为提升产品质量、加速交付速度的不可或缺的一环。本文深入探讨了自动化测试的重要性,分析了其在不同阶段的应用价值,并结合实际案例阐述了如何有效实施自动化测试策略,以期为读者提供一套可操作的实践指南。
|
14天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
54 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
6天前
|
Devops jenkins 测试技术
DevOps实践:自动化部署与持续集成的融合之旅
【10月更文挑战第41天】在软件开发的世界中,快速迭代和高效交付是企业竞争力的关键。本文将带你走进DevOps的核心实践——自动化部署与持续集成,揭示如何通过它们提升开发流程的效率与质量。我们将从DevOps的基本理念出发,逐步深入到具体的技术实现,最终展示一个实际的代码示例,让理论与实践相结合,为你的开发旅程提供清晰的指引。
16 4
|
8天前
|
Web App开发 敏捷开发 测试技术
探索自动化测试的奥秘:从理论到实践
【10月更文挑战第39天】在软件质量保障的战场上,自动化测试是提升效率和准确性的利器。本文将深入浅出地介绍自动化测试的基本概念、必要性以及如何实施自动化测试。我们将通过一个实际案例,展示如何利用流行的自动化测试工具Selenium进行网页测试,并分享一些实用的技巧和最佳实践。无论你是新手还是有经验的测试工程师,这篇文章都将为你提供宝贵的知识,帮助你在自动化测试的道路上更进一步。
|
8天前
|
敏捷开发 Java 测试技术
探索自动化测试:从理论到实践
【10月更文挑战第39天】在软件开发的海洋中,自动化测试是一艘能够带领团队高效航行的船只。本文将作为你的航海图,指引你理解自动化测试的核心概念,并分享一段实际的代码旅程,让你领略自动化测试的魅力和力量。准备好了吗?让我们启航!
|
12天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
9天前
|
机器学习/深度学习 数据采集 人工智能
智能运维:从自动化到AIOps的演进与实践####
本文探讨了智能运维(AIOps)的兴起背景、核心组件及其在现代IT运维中的应用。通过对比传统运维模式,阐述了AIOps如何利用机器学习、大数据分析等技术,实现故障预测、根因分析、自动化修复等功能,从而提升系统稳定性和运维效率。文章还深入分析了实施AIOps面临的挑战与解决方案,并展望了其未来发展趋势。 ####
下一篇
无影云桌面