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 至少需要一条类型为 ActivityTestRule 的 JUnit 规则来指定活动。Android JUnit 运行器将使用 ActivityTestRule 启动要启动的活动。
每个测试用例至少需要一条 onView 或 onDate(用于查找基于数据的视图,如 AdapterView)方法调用来匹配并找到所需的视图。 onView 或 onData 返回 ViewInteraction 对象。
返回 ViewInteraction 对象后,我们可以调用所选视图的操作,也可以使用断言检查视图是否为预期视图。
可以通过传递任何可用的视图操作,使用 ViewInteraction 对象的 perform 方法调用操作。
可以通过传递任何可用的视图断言,使用 ViewInteraction 对象的 check 方法调用断言。
Workflow 的图表表示如下,
示例 - 视图断言
让我们编写一个简单的测试用例来查找文本在我们的"HelloWorldApp"应用程序中,将"Hello World!"文本添加到视图中,然后使用视图断言对其进行断言。完整代码如下,
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 appContext = InstrumentationRegistry.getTargetContext(); assertEquals("com.tutorialspoint.espressosamples.helloworldapp", appContext.getPackageName()); } }
在这里,我们使用 withText 视图匹配器来查找包含"Hello World!"文本的文本视图,并匹配视图断言以断言文本视图已正确显示。在 Android Studio 中调用测试用例后,它将运行测试用例并报告成功消息,如下所示。