猪小花1号

个人签名

282篇博客

AndroidUI自动化测试的框架-Espresso简介

猪小花1号2018-09-03 09:22

作者:陈洁


最近接触了Google官方提供的AndroidUI自动化测试的框架-Espresso,Espresso是一个新工具,相对于其他工具,API更加精确。并且规模更小、

更简洁并且容易学习。Espresso支持API level 8级(Froyo)、10(Gingerbread),和15(Ice Cream Sandwich)及后续。

简介

Espresso的关键特征

1、快速;

2、代码快速上手;

3、容易扩展;

4、无需考虑复杂的多线程测试;

5、支持录制测试场景;

6、有Google做靠山。

个人认为最大的好处就是简单易学,同时支持录制交互,在录制的交互中添加断言,从而快速实现UI测试自动化。

Espresso的主要测试实现

Espresso实现的通用的思路就是:

找到某个元素,做一些操作,检查结果。

这里包含了三个流程:

•找元素:找到UI上测试所针对的元素;

•做操作:给这个元素做一些操作;

•检查结果:这个元素做出了我期望的行为。

以上三个小步骤在Espresso测试中语法组成就是:

 

onView(ViewMachers):寻找用来测试的View, 允许可以通过多次的onView方法,在层次图中找到目标视图(views)。

perform(ViewActions):发送交互事件(例如点击、输入等交互)。

check(ViewAssertions):用于检验测试结果。

Espresso的所有方法可以通过查阅下边的图表找到。

详细用法可以参照谷歌提供的样例demo:https://google.github.io/android-testing-support-library/samples/index.html

Espresso优缺点

Espresso的API体积小、可预见、简单易学,构建在Android仪表框架的基础上。使用它,能让你快速编写出简洁可靠的Android UI测试。另外Espresso测试有个很强大的地方是它在多个测试操作中是线程安全的。Espresso会等待当前进程的消息队列中的UI事件,并且在任何一个测试操作中会等待其中的AsyncTask结束才会执行下一个测试。这能够解决程序中大部分的线程同步问题。但也有自己的缺点:例如只支持Android平台的测试.

下面拿一个小例子来演示下Espresso测试步骤

1.创建新的AndroidStudio工程

如果是第一次启动AndroidStudio,从欢迎页选择“StartanewAndroidStudioproject”。如果已经打开了一个工程,选择File>New>NewProject...

2.为app添加简单的交互

在使用Espresso进行UI测试前,让我们为app添加一些Views和简单的交互。我们使用一个用户可以输入名字的EditText,欢迎用户的Button和用于输出的TextView。打开res/layout/activity_main.xml,粘贴如下代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:text="@string/hello_world" android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText
android:hint="Enter your name here"
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/textView"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Say hello!"
android:layout_below="@+id/editText"
android:onClick="sayHello"/>
</RelativeLayout>

还需要在MainActivity.java中添加如下代码:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void sayHello(View v){
TextView textView = (TextView) findViewById(R.id.textView);
EditText editText = (EditText) findViewById(R.id.editText);
textView.setText("Hello, " + editText.getText().toString() + "!");
}
}

现在可以运行app并确认一切工作正常。在点击Run按钮之前,确认你的RunConfiguration没有设置为运行测试。如需更改,点击下拉选项,选择app。

添加代码后的UI如下

3.创建并运行Espresso测试

在工程的整体视图上,找到以(androidTest)后缀结尾的包名并创建一个新的Java类。可以将它命名为MainActivityInstrumentationTest,将如下代码粘贴过去。

import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.action.ViewActions;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
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.closeSoftKeyboard;
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;
@RunWith(AndroidJUnit4.class)
public class MainActivityInstrumentationTest {
private static final String STRING_TO_BE_TYPED = "Peter";
@Rule
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
MainActivity.class);
@Test
public void sayHello(){
onView(withId(R.id.editText)).perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard());
onView(withText("Say hello!")).perform(click());
String expectedText = "Hello, " + STRING_TO_BE_TYPED + "!";
onView(withId(R.id.textView)).check(matches(withText(expectedText)));
}
}

测试类通过AndroidJUnitRunner运行,并执行sayHello()方法。下面将逐行解释都做了什么:

1.首先,找到ID为editText的view,输入CJ,然后关闭键盘;

2.接下来,点击Sayhello!的View,我们没有在布局的XML中为这个Button设置id,因此,通过搜索它上面的文字来找到它;

3.最后,将TextView上的文本同预期结果对比,如果一致则测试通过;

测试结果:

注意:

1、MainActivity应与工程项目中的MainActivity对应

2、和其他UI测试自动化用例一样,每个测试用例之前应加@Test


网易云大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者陈洁授权发布。