Espresso 测试框架 - 架构



在本章中,让我们学习 Espresso 测试框架的术语,如何编写一个简单的 Espresso 测试用例以及 Espresso 测试框架的完整工作流程或架构。

概述

Espresso 提供了大量的类来测试用户界面和 Android 应用程序的用户交互。它们可以分为以下五类:

JUnit 运行器

Android 测试框架提供了一个运行器 AndroidJUnitRunner 来运行用 JUnit3 和 JUnit4 风格编写的 Espresso 测试用例。它专用于 Android 应用程序,并且可以透明地处理在实际设备或模拟器中加载 Espresso 测试用例和被测应用程序、执行测试用例以及报告测试用例结果。要在测试用例中使用 AndroidJUnitRunner,我们需要使用 @RunWith 注解对测试类进行注解,然后传递 AndroidJUnitRunner 参数,如下所示:

@RunWith(AndroidJUnit4.class)
   public class ExampleInstrumentedTest {
}

JUnit 规则

Android 测试框架提供了一个规则 ActivityTestRule,用于在执行测试用例之前启动 Android 活动。它在每个用 @Test 和 @Before 注解的方法之前启动活动。它将在用 @After 注解的方法之后终止活动。示例代码如下:

@Rule
public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

这里,MainActivity 是在运行测试用例之前要启动的活动,并在运行完特定测试用例后销毁。

ViewMatchers

Espresso 提供了大量的视图匹配器类(在 androidx.test.espresso.matcher.ViewMatchers 包中)来匹配和查找 Android 活动屏幕视图层次结构中的 UI 元素/视图。Espresso 的方法 onView 接收一个类型为 Matcher(视图匹配器)的单个参数,找到相应的 UI 视图并返回相应的 ViewInteraction 对象。onView 方法返回的 ViewInteraction 对象可以进一步用于调用诸如单击匹配的视图之类的操作,或者可以用于断言匹配的视图。查找文本为“Hello World!”的视图的示例代码如下:

ViewInteraction viewInteraction = Espresso.onView(withText("Hello World!"));

这里,withText 是一个匹配器,可用于匹配具有文本“Hello World!”的 UI 视图。

ViewActions

Espresso 提供了大量的视图操作类(在 androidx.test.espresso.action.ViewActions 中)来在选定的/匹配的视图上调用不同的操作。一旦 onView 匹配并返回 ViewInteraction 对象,就可以通过调用 ViewInteraction 对象的“perform”方法并将其与适当的视图操作一起传递来调用任何操作。单击匹配视图的示例代码如下:

ViewInteraction viewInteraction = Espresso.onView(withText("Hello World!"));
viewInteraction.perform(click());

这里,将调用匹配视图的点击操作。

ViewAssertions

与视图匹配器和视图操作类似,Espresso 提供了大量的视图断言(在 androidx.test.espresso.assertion.ViewAssertions 包中)来断言匹配的视图是我们期望的。一旦 onView 匹配并返回 ViewInteraction 对象,就可以通过将 ViewInteraction 的 check 方法与适当的视图断言一起传递来检查任何断言。断言匹配视图的示例代码如下:

ViewInteraction viewInteraction = Espresso.onView(withText("Hello World!"));
viewInteraction.check(matches(withId(R.id.text_view)));

这里,matches 接受视图匹配器并返回视图断言,可以通过 ViewInteraction 的 check 方法进行检查。

Espresso 测试框架的工作流程

让我们了解 Espresso 测试框架是如何工作的,以及它如何以简单灵活的方式提供执行任何种类用户交互的选项。Espresso 测试用例的工作流程如下所述:

  • 正如我们之前了解到的,Android JUnit 运行器 AndroidJUnit4 将运行 Android 测试用例。Espresso 测试用例需要用 @RunWith(AndroidJUnut.class) 标记。首先,AndroidJUnit4 将准备运行测试用例的环境。它启动连接的 Android 设备或模拟器,安装应用程序并确保要测试的应用程序处于就绪状态。它将运行测试用例并报告结果。

  • Espresso 至少需要一个类型为 ActivityTestRuleJUnit 规则来指定活动。Android JUnit 运行器将使用 ActivityTestRule 启动要启动的活动。

  • 每个测试用例至少需要一个 onViewonDate(用于查找基于数据视图,例如 AdapterView)方法调用来匹配和查找所需的视图。onView 或 onData 返回 ViewInteraction 对象。

  • 一旦返回了 ViewInteraction 对象,我们就可以调用所选视图的操作,或者使用断言检查视图以获取我们期望的视图。

  • 可以使用 ViewInteraction 对象的 perform 方法通过传递任何一个可用的视图操作来调用操作。

  • 可以使用 ViewInteraction 对象的 check 方法通过传递任何一个可用的视图断言来调用断言。

工作流程的图表表示如下:

WorkFlow

示例 - 视图断言

让我们编写一个简单的测试用例,在我们的“HelloWorldApp”应用程序中查找文本为“Hello World!”的 TextView,然后使用视图断言对其进行断言。完整的代码如下:

package com.tutorialspoint.espressosamples.helloworldapp;

import android.content.Context;
import androidx.test.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.matcher.ViewMatchers.withText;;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static org.junit.Assert.*;
/**
   * Instrumented test, which will execute on an Android device.
   *
   * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
   @Rule
   public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);
   @Test
   public void view_isCorrect() {
      onView(withText("Hello World!")).check(matches(isDisplayed()));
   }
   @Test
   public void useAppContext() {
      // Context of the app under test.
      Context appContext = InstrumentationRegistry.getTargetContext();
      assertEquals("com.tutorialspoint.espressosamples.helloworldapp", appContext.getPackageName());
   }
}

这里,我们使用了 withText 视图匹配器来查找文本为“Hello World!”的 TextView,并使用 matches 视图断言来断言 TextView 是否正确显示。一旦在 Android Studio 中调用测试用例,它将运行测试用例并报告如下成功消息。

view_isCorrect 测试用例

Test Case

广告