欢迎访问 生活随笔!

凯发ag旗舰厅登录网址下载

当前位置: 凯发ag旗舰厅登录网址下载 > 运维知识 > android >内容正文

android

android自动化测试-凯发ag旗舰厅登录网址下载

发布时间:2025/1/21 android 18 豆豆
凯发ag旗舰厅登录网址下载 收集整理的这篇文章主要介绍了 android自动化测试-从入门到入门(5)adapterview的测试 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

在之前的文章中,我们简单介绍了espresso的使用。通过onview()方法我们可以快速定位到界面上我们需要测试的目标元素。整体来说,onview()比较适用于ui比较简单的情况,在不需要过于复杂的匹配条件的情况下是很方便的。但是,对于类似listview这种有ui复用的元素来说,只是通过onview()就显得复杂了一点,我们来看一下针对这种情况应有何种方案。

adapterview

adapterview是一种通过adapter来动态加载数据的界面元素。我们常用的listview, gridview, spinner等等都属于adapterview。不同于我们之前提到的静态的控件,adapterview在加载数据时,可能只有一部分显示在了屏幕上,对于没有显示在屏幕上的那部分数据,我们通过onview()是没有办法找到的。

对于adapterview,espresso提供了如下方法用来查找元素:

/*** creates an {@link datainteraction} for a data object displayed by the application. use this* method to load (into the view hierarchy) items from adapterview widgets (e.g. listview).** @param datamatcher a matcher used to find the data object.*/ public static datainteraction ondata(matcher datamatcher) {}

我们首先来研究一下这个方法的返回值。从以上定义可以看出,该方法返回了一个datainteraction对象,还记得onview()方法返回的viewinteraction对象么?这两者的区别可以大概描述为:

  • viewinteraction: 关注于已经匹配到的目标控件。通过onview()方法我们可以找到符合匹配条件的唯一的目标控件,我们只需要针对这个控件进行我们需要的操作。

  • datainteraction: 关注于adapterview的数据。由于adapterview的数据源可能很长,很多时候无法一次性将所有数据源显示在屏幕上,因此我们主要先关注adapterview中包含的数据,而非一次性就进行view的匹配。

我们再来研究一下这个方法的入参。从以上定义看出,该方法接收了一个matcher的参数,该参数用来指定一个匹配规则。还记得onview()的入参么?是一个matcher对象。从类型上来看,这两者的区别也不言而喻:

  • matcher: 构造一个针对于view匹配的匹配规则;

  • matcher: 构造一个针对于object(数据)匹配的匹配规则。

从以上对比可以看出,我们在使用ondata()方法对adapterview进行测试的时候,我们的思路就转变成了首先关注这个adapterview的具体数据,而不是ui上呈现的内容。当然,我们最终的目标还是要找到目标的ui元素,但是我们是通过其数据源来进行入手的。

寻找数据

那么,接下来,我们就要学习如何去寻找我们需要的数据了!显然,要想找到我们需要的数据,就需要构造一个ondata()所使用的matcher对象,而这个对象的构造和使用实际上和之前我们所用的针对于view的matcher大概雷同。比如,我们可以指定单一条件:

ondata(is(instanceof(myobject.class)))

表示我们需要找一个adapterview,其数据源的类型是myobject(这是一个自定义的类)。当然了,我们肯定还是需要更加精确地去寻找一个adapterview中的指定条目,于是我们可以采用allof()来构造一个符合匹配条件:

ondata(allof(is(instanceof(myobject.class)), mycustommatcher()))

如上代码便使用allof()方法构造了一个符合匹配规则(allof()方法可以参考第三篇文章espresso入门里的介绍)。而上面的mycustommatcher()方法构造了一个自定义的matcher,我们可以采用自己的自定义matcher来更加精准地进行数据的匹配。

自定义matcher

接下来我们要感受一下自定义matcher的强大之处了!为了更好地给大家介绍自定义matcher,我举一个答疑君app里面的例子来进行说明。

在答疑君app的老师页面,有一个老师搜索的功能。当我点击搜索框时,界面上便会显示之前的搜索关键字历史。现在,我需要在这个搜索关键字列表中点击相应的关键字来触发搜索。

简单来说,我的目的就是:在搜索历史listview中点击搜索关键字为text的条目。

首先,我的listview的数据源类型为list,于是我先构造一个数据类型匹配条件:

is(instanceof(searchitem.class))

这个构造条件就指定了列表的数据源为searchitem类型。请注意,espresso在根据ondata()进行类型匹配时,是根据我们的adapter.getitem()方法返回的数据类型进行匹配的。如果我们自己实现了一个自定义的adapter,请注意我们构造的匹配规则要和getitem()方法返回的数据类型相统一。

接下来,我就需要去找那个含有text关键字的数据项了。我的searchitem类的定义极其简单:

public class searchitem {private string keyword;public searchitem() {}public void setkeyword(string keyword) {this.keyword = keyword;}public string getkeyword() {return keyword;} }

接下来我只要找到那个keyword为text的searchitem数据项就可以了。为此,我构造了如下的一个自定义matcher:

/*** 查找指定关键字的搜索条件* @param name 需要搜索的关键字*/ public static matcher
网站地图