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标志,表示构建会继续即使有失败的测试。多个变体运行的结果如下: