太原Java培训
达内太原java培训中心

0351-5608878

热门课程

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

  • 时间:2016-11-25
  • 发布:云栖博客
  • 来源:云栖博客

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

入门问题解决了,要真正在业务中实践还需要面临不少挑战,就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跳转方式,才能真正使这个解决方案大放光彩。

好了,今天就给大家讲这么多吧,喜欢我的内容可以关注或者分享(微信公众平台:tytedu)选择太原达内培训,不再孤军奋战,轻轻松松做IT高薪白领。太原达内培训带领有明确目标的学子迈向成功之路!

上一篇:以开放、融合之心,连接用户与开源社区
下一篇:UI自动化Macaca-Java版实践心得(二)

Apache Lucene 6.4.2 发布,Java 搜索引擎

太原Java培训教你提高自己的编程速度

太原java培训编程如人生

Java编程基本概念

选择城市和中心
贵州省

广西省

海南省