espresso基础架构与API分析

Espresso测试框架提供了一组API来构建UI测试,以测试应用程序内的用户流。 这些API让您能够编写简洁,运行可靠的自动化UI测试。 Espresso非常适合编写白盒式自动化测试,其中测试代码使用来自所测试的应用程序的实现代码细节。

Espresso测试框架的主要功能包括:

用于在目标应用程序中查看和适配器匹配的灵活API。 有关详细信息,请参阅View matching
一组广泛的操作API,用于自动化UI交互。 有关更多信息,请参阅 Action APIs
UI线程同步提高测试的可靠性。 有关更多信息,请参阅 UI thread synchronization
可以作为参数传入 ​ViewInteraction.check()​方法中的 ViewAssertion 的集合。通常,你会使用带有视图匹配器的匹配断言来判断当前被选中视图的状态,请参阅ViewAssertions
需要Android 2.2(API级别8)或更高版本。

View matching

onView()

Espresso.onView()方法允许您访问目标应用程序中的UI组件并与其进行交互。 该方法接受Matcher参数并搜索视图层次以定位满足某些给定标准的对应View实例。 您可以通过指定以下条件来优化搜索:

  • 视图的类名
  • 视图的内容描述
  • 视图的R.id
  • 视图中显示的文本
    例如,要定位ID值为my_button的按钮,您可以指定一个匹配器,如下所示:

onView(withId(R.id.my_button));
如果搜索成功,onView()方法返回一个引用,该引用允许您对目标视图执行用户操作和测试断言。

123
public static ViewInteraction onView(final Matcher<View> viewMatcher) {   return BASE.plus(new ViewInteractionModule(viewMatcher)).viewInteraction(); }

ViewMatchers

onView方法需要传入类型为Matcher泛型viewMatcher对象.

ViewMatchers类中方法有

1
isAssignableFrom,withClassName,isDisplayed,isCompletelyDisplayed,isDisplayingAtLeast,isEnabled,isFocusable,hasFocus,isSelected,hasSibling,withContentDescription,withContentDescription,withContentDescription,withId,withResourceName,withTagKey,withTagValue,withText,withCharSequence,withHint,isChecked,isNotChecked,withCheckBoxState,hasContentDescription,hasDescendant,isClickable,isDescendantOfA,withEffectiveVisibility,withParent,withChild,isRoot,supportsInputMethods,hasImeAction,hasImeAction,hasLinks,assertThat,withSpinnerText,isJavascriptEnabled,hasErrorText,withInputType。

这些方法能够帮助我们快速定位到特定的视图。
我们来看看常用的几个方法
withId
返回基于资源ids匹配视图的匹配器。
withText
返回基于TextView的文本属性值匹配TextView的匹配器。
onView(allOf(withId(R.id.my_view), withText("Hello!")))
isDisplayed
返回与当前显示在屏幕上的视图匹配的匹配器给用户。
如下

Espresso.onView(ViewMatchers.withId(R.id.mpu_summary_send_receipt_button)) .check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
其他API方法可以在以下文档中找到具体用法和解释,我们并不需要记住每个方法,遇到具体的场景的时候再过来查询也来得及
viewmatchers-API

ViewMatchers与hamcrest匹配器配合使用

什么是hamcrest?

Hamcrest框架是junit4框架新引入的断言框架,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活。
我们可以通过各种viewmatchers与Hamcrest组合匹配器来缩小搜索的范围。
如以下示例所示:

onView(allOf(withId(R.id.button_signin), withText("Sign-in")));

你也可以使用 ​not​ 反转匹配:

onView(allOf(withId(R.id.button_signin), not(withText("Sign-out"))));
注意:
一个工程化的应用中,所有用户可与之交互的视图都应该包含说明文字或有一个内容描述(参考 Android 可访问性指导)。如果你不能通过使用 ‘withText’ 或 ‘withContentDescripiton’ 来缩小onView的搜索范围,可以认为这是一个可访问性的 bug。

请使用最少的匹配器来定位视图。不要过指定,因为这将强制框架做无用功。例如,如果一个视图可以通过它的文字唯一确定,你不需要说明该视图也可以通过 ​TextView​ 指定。对许多视图而言,使用它的​R.id​值就足够了。

更多的hamcrest api请查看
hamcrest api

###onData
当espresso在AdapterView中查找视图时需要用onData方法,例如在AdapterView小部件中,视图在运行时动态填充子视图。如果要测试的目标视图位于AdapterView(例如ListView,GridView或Spinner)中,则onView()方法可能无法工作,因为只有一部分视图可能会加载到当前视图层次结构中。

相反,调用onData()方法可获取DataInteraction对象以访问目标视图元素。 Espresso处理将目标视图元素加载到当前视图层次结构中。 Espresso还负责滚动到目标元素,并将放在焦点元素。

注意:onData()方法不检查您指定的项目是否与视图对应。 Espresso仅搜索当前视图层次结构。如果没有找到匹配,该方法将抛出NoMatchingViewException异常。

下面的代码片段展示了如何使用onData()方法和Hamcrest匹配来搜索包含给定字符串的列表中的特定行。在此示例中,LongListActivity类包含通过SimpleAdapter公开的字符串列表。

12
onData(allOf(is(instanceOf(Map.class)),        hasEntry(equalTo(LongListActivity.ROW_TEXT), is("test input")));

Performing Actions

调用ViewInteraction.perform()或DataInteraction.perform()方法来模拟UI组件上的用户交互。您必须传入一个或多个ViewAction对象作为参数。Espresso按照给定的顺序依次触发每个动作,并在主线程中执行它们。
ViewActions类提供了指定常用操作的帮助方法列表。您可以使用这些方法作为方便的快捷方式,而不是创建和配置单个ViewAction对象。您可以指定以下操作:

  • ViewActions.click():点击视图。
  • ViewActions.typeText():点击视图并输入指定的字符串。
  • ViewActions.scrollTo():滚动到视图。目标视图必须是来自ScrollView的子类,它的android:visibility属性的值必须是VISIBLE。对于扩展AdapterView(例如,ListView)的视图,onData()方法为您处理滚动。
  • ViewActions.pressKey():使用指定的键码执行键按下。
  • ViewActions.clearText():清除目标视图中的文本。
    如果目标视图位于ScrollView内部,请先执行ViewActions.scrollTo()操作,以在其他操作进行之前在屏幕中显示视图。如果视图已显示,ViewActions.scrollTo()操作将不起作用。

例如,要模拟输入字符串值并按按钮提交值,您可以编写类似这样的自动测试脚本。 ViewInteraction.perform()和DataInteraction.perform()方法采用一个或多个ViewAction参数,并按提供的顺序运行操作。

//将文本键入EditText视图,然后关闭软键盘

12
onView(withId(R.id.editTextUserInput))     .perform(typeText(STRING_TO_BE_TYPED),closeSoftKeyboard());

//按按钮提交文本更改
onView(withId(R.id.changeTextBt)).perform(click());

其他action api 请查看
https://developer.android.com/reference/android/support/test/espresso/action/package-summary.html

Verifying Results

调用ViewInteraction.check()或DataInteraction.check()方法来断言UI中的视图匹配一些预期状态。 您必须传递一个ViewAssertion对象作为参数。 如果断言失败,Espresso会抛出一个AssertionFailedError。
ViewAssertions类提供了用于指定公共断言的帮助程序方法的列表。 您可以使用的断言包括:
doesNotExist:断言没有与当前视图层次结构中指定的条件匹配的视图。
matches:断言指定视图存在于当前视图层次结构中,并且其状态与某个给定的Hamcrest匹配器匹配。
selectedDescendentsMatch:存在指定的孩子为父视图查看的声明,它们的状态与某个给定的Hamcrest匹配器匹配。

以下代码段显示了如何检查UI中显示的文本的值与之前在EditText字段中输入的文本的值相同。

123456789
public void testChangeText_sameActivity() {    // Type text and then press the button.    ...    onView(withText(R.string.item_1_text))            .check(doesNotExist());    // Check that the text was changed.    onView(withId(R.id.textToBeChanged))            .check(matches(withText(STRING_TO_BE_TYPED)));}

ViewMatchers, ViewActions, ViewAssertions 组成了espresso的基础架构,所以要真正的掌握espresso必须将这3部分基础熟悉。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-28 17:00:03

espresso基础架构与API分析的相关文章

共享基础架构平台优势分析

  中小企业最初都是从部署一台服务器开始,之后再慢慢扩展至三台或者四台不同型号不同代别,甚至不同品牌的服务器.在这个过程中,他们还会安装网络交换机以连接这些服务器,以及不同的存储平台以保留其不断增长的数据.最终,出现了互操作问题,以及占用大量空间的各种设备,这些设备不仅连接杂乱,而且极难维护.如此混乱无绪的IT环境,导致企业很难推动业务增长.提升工作效率提升. 近几年,随着大数据和云计算带来融合趋势,各个厂商纷纷推出一体化整合产品方案.这种方案的含义是将多个信息技术(IT)组件进行融合,组成一个

基础架构研发思路分析

半年多以前,我曾经撰文一篇<纪录中国企业存储的自主之路>,讨论的是厂商(供应商)自主研发创新方面的话题;今天,我要写的是IT基础设施的用户端,在数据中心方面的投入的研发.前者比较好理解,只有掌握一定的核心技术才能保证产品的持久竞争力和销路;而作为像Google.Facebook.百度.阿里巴巴这样的互联网企业来说,他们的定位是服务提供商,数据中心的研发则是为了降低IT运维的TCO(总体拥有成本). 1月11日,微博上的消息使我注意到百度在南京举办的活动.尽管笔者没有亲临现场,但随后也看到了百度

整个MBA,EMBA的基础架构就是各类案例分析

最近一段时间没有怎么写案例类的文章了,今天开始会多写写案例类的文章. 因为这几天我突然想明白一个事情,就是整个MBA,EMBA的基础架构就是各类案例分析,案例对创业者的启发是非常大的,所以多写各类互联网的最新案例会很有意义. 转到正题,今天给大家带来一个日本的最新案例. 我们都知道一般电商平台大概有这3类: 1.类似淘宝,京东这样的销售实物和虚拟物品类的电商平台. 2.类似美团网这样的O2O电商平台,销售的主要是线下的服务体验类产品. 3.类似YY教育这样的网校教育电商平台. 而今天给大家带来的

云配给就是指在云基础架构上部署和管理IT资源的过程

本文作者详细介绍了一种配给性能测试方法,您可以使用它判断出现配给性能滞后的位置. 本文描述了一种配给性能测试方法,您可以使用它判断哪些位置出现云计算配给性能滞后.该配给性能测试的目的是: 从用户角度以端到端的方式测量总的配给时间. 当同时存在多个配给时,判断配给时间的趋势. 将整个配给时间分解为几个部分,从而判断哪些组件和步骤占用的性能开销最多. 当系统中有许多配给请求时,获得组件级别的排队信息,从而帮助找出瓶颈. 让我们了解一些云配给的基础知识. 云配给的基础知识 云配给是指在云基础架构上部署

构建一个高可用及自动发现的Docker基础架构

Docker的生态日趋成熟,开源社区也不断孵化出优秀的周边项目,覆盖网络.监控.维护.部署.开发等方面.帮助开发.运维人员快速构建.运营Docker服务环境,其中也不乏有大公司的影子,如Google.IBM.Redhat,甚至微软也宣称后续将提供Docker在Windows平台的支持.Docker的发展前景一片大好.但在企业当中,如何选择适合自己的Docker构建方案?可选的方案有kubernetes与CoreOS(都已整合各类组件),另外一种方案为Haproxy+etcd+confd,采用松散

基于成熟基础架构云平台的服务云建设

[硅谷网12月12日文]据<硅谷>杂志2012年第18期刊文,在分析当前云服务建设产业发展机遇的基础上,分析了传统云平台服务建设存在的主要问题.最后,基于成熟的基础架构云(IAAS)平台产品完成基础设施的整合和基础架构云的基础环境部署,验证基础架构云的相关技术能力.成熟度.安全性.可扩展性符合云计算云平台的要求. 0引言 近年来,全球云计算产业蓬勃发展.我国云计算产业兴起于20世纪90年代,云计算产业已经形成了竞争性的产业发展态势,以展览展示.网络游戏.远程教育.数字电视内容制作以及各种影视动

手机淘宝移动端接入网关基础架构演进之路

移动网络优化是超级App永恒的话题,对于无线电商来说更为重要,网络请求体验跟用户的购买行为息息相关,手机淘宝从过去的HTTP API网关,到2014年升级支持SPDY,2015年双十一自研高性能.全双工.安全的ACCS(阿里云通道服务)扛住双十一战场主要流量,无论是基础架构的演进.网络调优.协议的优化.异地多活.网络调度上都有不少宝贵的经验与大家分享. ACCS基于无线场景精心设计的双工 .安全.低时延.开放的移动统一接入层服务,在双十一当天稳定高效地服务了近2亿的在线用户,支持了峰值4500万

配置一个服务器端WebSphere Application Server基础架构

具体步骤包括安装必备产品(IBM® Worklight Studio.部署到一个 IBM WebSphere® Application Server Liberty Profile 的 Worklight Server,以及一个 Base Profile),启用服务器端.端到端安全:配置服务器端基础架构以实现 FIPS 140-2 合规性:最后通过 WebSphere 基础架构的日志记录.跟踪和测量设施来测量.收集.分析和验证 FIPS 140-2 合规性. 来自美国国家标准和技术研究所 (NI

重塑与融合 新华三Synergy塑合型基础架构的意义

当今的企业IT基础设施正在面临变革,传统工作负载与新型应用对企业IT基础设施提出了更高的要求.于是,我们看到了融合架构.超融合架构等新的计算设备形态.如果说这些你已经觉得不新鲜的话,那么你知道什么叫塑合型基础架构? 作为业内首个塑合型基础架构平台,新华三Synergy采用了组合式框架,将计算.存储.网络等设备通过具备软件定义.自动化等特性的管理设备,集成为统一的IT基础设施交付给用户,帮助用户实现降低IT成本.快速部署.快速应用开发.无缝更新等目标.无论是传统数据中心还是云计算应用场景,Syne