原文地址:
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的交互。(通过onView和onData)
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的例子。
领取专属 10元无门槛券
私享最新 技术干货