- Espresso 测试框架教程
- Espresso 测试 - 首页
- 简介
- 设置说明
- 在 Android Studio 中运行测试
- JUnit 概述
- 架构
- 视图匹配器
- 自定义视图匹配器
- 视图断言
- 视图操作
- 测试 AdapterView
- 测试 WebView
- 测试异步操作
- 测试 Intent
- 测试多个应用程序的 UI
- 测试录制器
- 测试 UI 性能
- 测试可访问性
- Espresso 测试资源
- Espresso 测试 - 快速指南
- Espresso 测试 - 有用资源
- Espresso 测试 - 讨论
自定义视图匹配器
Espresso 提供了多种选项来创建我们自己的自定义视图匹配器,它基于 Hamcrest 匹配器。自定义匹配器是一个非常强大的概念,可以扩展框架,也可以根据我们的喜好自定义框架。编写自定义匹配器的一些优点如下:
利用我们自己的自定义视图的独特功能
自定义匹配器有助于 AdapterView 基于测试用例匹配不同类型的底层数据。
通过组合多个匹配器的功能来简化当前的匹配器
我们可以根据需要创建新的匹配器,这非常容易。让我们创建一个新的自定义匹配器,它返回一个匹配器来测试 TextView 的 id 和文本。
Espresso 提供以下两个类来编写新的匹配器:
TypeSafeMatcher
BoundedMatcher
这两个类的性质相似,除了 BoundedMatcher 透明地处理对象的类型转换到正确的类型,而无需手动检查正确的类型。我们将使用 BoundedMatcher 类创建一个新的匹配器 withIdAndText。让我们检查编写新匹配器的步骤。
在 app/build.gradle 文件中添加以下依赖项并同步。
dependencies { implementation 'androidx.test.espresso:espresso-core:3.1.1' }
创建一个新类来包含我们的匹配器(方法)并将其标记为 final
public final class MyMatchers { }
在新类中声明一个静态方法,并使用必要的参数,并将 Matcher<View> 设置为返回类型。
public final class MyMatchers { @NonNull public static Matcher<View> withIdAndText(final Matcher<Integer> integerMatcher, final Matcher<String> stringMatcher) { } }
在静态方法内部创建一个新的 BoundedMatcher 对象(也作为返回值),使用以下签名:
public final class MyMatchers { @NonNull public static Matcher<View> withIdAndText(final Matcher<Integer> integerMatcher, final Matcher<String> stringMatcher) { return new BoundedMatcher<View, TextView>(TextView.class) { }; } }
在 BoundedMatcher 对象中覆盖 describeTo 和 matchesSafely 方法。describeTo 只有一个类型为 Description 的参数,没有返回值,用于提供有关匹配器的错误信息。matchesSafely 只有一个类型为 TextView 的参数,返回类型为 boolean,用于匹配视图。
代码的最终版本如下所示:
public final class MyMatchers { @NonNull public static Matcher<View> withIdAndText(final Matcher<Integer> integerMatcher, final Matcher<String> stringMatcher) { return new BoundedMatcher<View, TextView>(TextView.class) { @Override public void describeTo(final Description description) { description.appendText("error text: "); stringMatcher.describeTo(description); integerMatcher.describeTo(description); } @Override public boolean matchesSafely(final TextView textView) { return stringMatcher.matches(textView.getText().toString()) && integerMatcher.matches(textView.getId()); } }; } }
最后,我们可以使用我们的新匹配器编写测试用例,如下所示:
@Test public void view_customMatcher_isCorrect() { onView(withIdAndText(is((Integer) R.id.textView_hello), is((String) "Hello World!"))) .check(matches(withText("Hello World!"))); }