Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.4——使用Espresso测试Activity

问题:

你想要使用Google的Espresso测试Activity。

解决方案:

在Gradle配置里面增加Espresso,书写测试脚本。

讨论:

Espresso测试库已经被添加进“Android Test Kit”项目,作为Google的Android测试工具。因为Espresso是一个Google的项目,并且专门为Android设计,有理由相信它在未来会成为Android测试提供更好的机制。

尽管这不是一本关于测试的书,搭建和运行Espresso测试适合一般的Gradle实践,所以一个简单的例子在这里。

Espresso包括在Android Support Repository里面,可以在SDK Manager的“Extras”下面增加:

为了在项目里面使用Espresso,需要增加androidTestCompile依赖:

这实际上导致了support library的版本冲突,因为Espresso依赖于版本23.1.1,而SDK23里面包含了23.3.0的同样的库。你会收到下面的错误:

尽管这个会在你build应用的时候解决,但是让我们解决这个问题。在顶层的Gradle配置文件里面,allProject块里面强制解决方案:

Espresso要求设置在defaultConfig块里面设置testInstrumentationRunner使用AndroidJUnitRunner:

Espresso测试喜欢使用静态方法,无论是在Espresso类里面还是在Hamcrest matchers。下面的测试清晰的包含了输入的描述:

package com.nfjs.helloworldas;
import android.support.test.rule.ActivityTestRule; 
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.MediumTest; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.containsString;

 @RunWith(AndroidJUnit4.class) @MediumTest
  public class MyActivityEspressoTest

    extends ActivityInstrumentationTestCase2<MyActivity> {

    public MyActivityEspressoTest() {

      super(MyActivity.class);

    }

    @Rule

    public ActivityTestRule<MyActivity> mActivityRule =

      new ActivityTestRule<>(MyActivity.class);

    @Test

    public void testHelloWorld() {

      onView(withId(R.id.edit_text))

                .perform(typeText("Dolly"));
        onView(withId(R.id.hello_button))
                .perform(click());
        onView(withId(R.id.greeting_text))
                .check(matches(withText(containsString("Dolly"))));

  }

简单的语法更关注于用户的行为而不是activity。从这个测试里面,不是很明显的是,点击button实际是从MyAcitivity跳转到WelcomeActivity类,但是实际发生了。结果如下:

再次点击Devices按钮从device角度看结果:

Espresso是一个很有趣的写功能测试的DSL。它在未来会成为推荐的API。

收集测试结果:

如果你的app包含多个flavors或者modules,HTML测试报告将会组织到分离的子目录下面。单独打开每个文件会很麻烦。

幸运的是,有一个插件可以将所有报告收集到一个目录下面。在顶级的配置文件里面,在buildscript块后面加上androidreporting插件:

现在如果你运行mergeAndroidReports任务,所有都会被收集到一个文件里面。

--continue标志是一个标准的Gradle标志,表示构建会继续即使有失败的测试。多个变体运行的结果如下:

 

posted @ 2017-03-02 22:45  tootwo2  阅读(565)  评论(0编辑  收藏  举报