【译】Android测试:Espresso

原文地址:

http://alexzh.com/tutorials/android-testing-espresso-part-3/

译文:

这是Android测试工程的第三篇系列文章。

第一篇关于单元测试的文章可以在这里(http://alexzh.com/tutorials/android-testing-unit-testing/)读到。

第二篇关于Mockito 和 Robolectric测试框架的文章可以在这里(http://alexzh.com/tutorials/android-testing-mockito-robolectric/)读到。

所有的源代码都托管到Github。Github上面的项目有不同的分支:

app的基本版本:

https://github.com/AlexZhukovich/SimpleCoffeeOrderTestProject/tree/1_simple_coffee_order

有单元测试的基本版本app:

https://github.com/AlexZhukovich/SimpleCoffeeOrderTestProject/tree/2_unit_tests

基本版本 + payment activity:

https://github.com/AlexZhukovich/SimpleCoffeeOrderTestProject/tree/3_simple_coffee_order_paymentActivity

mockito and robolectric tests:

https://github.com/AlexZhukovich/SimpleCoffeeOrderTestProject/tree/4_mockito_and_robolectric_tests

列表App(ListView, RecyclerView) :

https://github.com/AlexZhukovich/SimpleCoffeeOrderTestProject/tree/5_coffee_list

使用espresso测试应用:

https://github.com/AlexZhukovich/SimpleCoffeeOrderTestProject/tree/6_coffee_list_espresso

1. Espresso是什么

Espresso测试框架,是官方提供的一个三方库Android Testing Support Library(https://developer.android.com/training/testing/),它提供一个模仿用户交互的API来测试一个独立的APP。Espresso支持Android 2.2(API 8)及以上的设备。使用Espresso的一个主要好处是它支持待测试App的UI和测试步骤自动同步。Espresso会在适当的时间执行测试命令,因为它会检测主线程是否空闲。从而提高测试的可靠性。这种能力也可以避免在测试代码中添加任何的定时处理,如sleep休眠期。

Espresso一个是设备依赖(instrumentation-based)框架,可以配合AndroidJUnitRunner(https://developer.android.com/reference/android/support/test/runner/AndroidJUnitRunner)一起使用。

2. 准备使用Espresso

(1) 安装/更新Android Support Libraries

首先,你可以使用SDK Manager来 安装/更新 Android Support Repository。

(2)Espresso接入项目

在app的build.gradle文件中添加测试依赖;

你可以添加exclude group,来避免版本的冲突。

下一步,为你的配置添加设备测试runner

3. 设置真机/模拟器 的建议

为了避免应用崩溃的一个小建议:在真机或模拟器上面关闭动画。

Window animation scale (窗口动画缩放)

Transition animation scale (过度动画缩放)

Animator duration scale (动画程序时长缩放)

你在手机的 设置-> 开发者选项 来改变这些参数。找到上面的参数并关闭这些动画。

4. 运行Espresso测试

(1)使用Android Studio

首先,你需要为instrumentation测试创建配置。点击选择 “Run/Edit Configuration...”,然后选择 “+” 按钮并点击 “Android Tests”。

接着,你需要为Android Test增加一个module。在我这个例子中,我将该Module添加到 “app”下,并命名为“EspressoTests”。

上述操作之后,你可以发现,你的运行菜单已经多了一项 “Espresso Tests”选项。

(2)使用gradle

如果你想要使用gradle运行 instrumentation test。你可以运行下面这行命令

or

当上述命令运行完毕之后,你可以在你的build 文件夹下面找到测试报告;

测试报告路径

//build/reports/androidTests/connected/index.html

5. 写Espresso测试

(1)基于Espresso组件

常用的几个Espresso组件

Espresso:Espresso框架的入口,Espresso类允许View的交互。(通过onViewonData

ViewMatchers:View与ID绑定的集合,可以将一个或多个绑定器传递给 onView方法。

ViewActions:常见View操作集合,如点击、长按、左右滑动等。

ViewAssertions:常见的ViewAssertions的集合,可以传递给check方法进行。

(2) 基于测试结构

Espresso的基本思想是不同View之间的交互。这里将展示如何使不同类型的view进行交互。你可以通过ID来找到与之对应的View,如textView、button。

① 与Button、TextView等View之间的交互 测试

如果你想通过ID来找到View,你可以使用WithId方法

或者你可以text来搜索view

如果你想做点击操作

② ListView 的交互 测试

ListView是一个 AdapterView,那就意味着ListView并不能初始加载所有项。这时候使用OnView(...)来验证ListView并不是一个好主意。但是,Espresso提供了onData(...)方法。这个方法允许你在使用ListView时加载所有项。

你可以使用下面的代码来找到text

或者,你可以指定在ListView的某个位置与项目进行交互。

③ Spinner的交互 测试

Spinner也是一个类似于ListView的AdapterView。你可以使用 onView(…)方法来验证spinner的一些用户操作后的文本变更。

然而,如果你想要从Spinner组件选择某个项,就可以使用 onData(...)方法。

④ RecyclerView的交互 测试

RecyclerView不是一个AdapterView,那就意味着你不能使用 onData(...)方法。当然,Espresso也为RecyclerView提供了支持。你必须添加以下依赖:

现在你可以使用 RecyclerViewActions 来测试RecyclerView的交互

6. 静态导入

上面的代码很不精简。你可以使用一些静态的导入,来使代码看起来好看一点。

上面的代码就精简成下面。

通过上面的改变,代码就会变得更加紧凑。

7. 配置自定义 intents

有时候在使用startIntent打开一些Activity的时候需要附加一些参数。例如,当前页面显示的text来自于前一个页面。这个时候,你可以创建一个配置的ActivityTestRule,但是在这个例子中,你必须要将这个规则添加到每个test中。

首先,你需要添加gradle依赖。

接着,你就可以配置intent

或者,你可以根据ActivityTestRule的定义来为每个test来配置Intent。

8. 测试异步模块

Espresso的一个主要的特性就是测试与应用程序之间的同步。

默认情况下,Espresso将所有的view操作与UI线程以及异步任务(AsyncTask)之间同步。Espresso允许在test中使用自定义资源。但是,如果你的应用程序执行长时间的运行操作,Espresso对此是无感的。这一点也许是test中的一个问题,因为毕竟我们通常都是通过网络请求得到数据。

接下来就向您展示如何创建自定义空闲资源,并将其用于你的测试。在实现自定义IdlingResource之前,必须了解一些主要信息。

IdlingResource接口定义了下fan面三个方法:

public String getName()

public boolean isIdleNow()

public void registerIdleTransitionCallback(ResourceCallback callback)

getName方法返回一个确认 Idling资源的的String类型。当然,这个String类型的不能为null。

isIdleNow方法返回空闲资源的当前状态。

registerIdleTransitionCallback 方法存储有关通知空闲资源状态变更的回调信息。

在下面的小例子中,我简单地使用了service:

这个应用展示 咖啡价格列表:

第一步我想要点击每个item里面的view,最好的方法就是为其创建自定义的action。

第二步我想要确认每个item中的文本,可以创建一个附加的action。

我还想创建两个方法来简化接下来的操作。

最后,下面就是使用espresso简单测试这个Activity的例子。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181001G0GVI400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券