初识Espresso

原创 2018年04月16日 13:59:56

本篇内容介绍了Espresso框架的基本使用.

Espresso测试框架介绍

Espresso 是一个可以轻松编写可靠用户界面测试的测试框架.

Google 于2013年10月发布了 Espresso 框架. 自2.0版本以来一直是 Android 支持库(Android Support Repository)的一部分.

Espresso 会自动将你的测试操作与应用程序的用户界面同步. 这个框架还确保 Activity 是在测试运行之前启动. 并在执行结束后将所有后台 Activity 执行完成(finished).

Espresso 一般用于测试单个应用程序, 但也可以用于跨应用程序进行测试. 如果用于应用程序之外进行测试, 则只能进行黑盒测试, 因为你无法访问到你应用程序之外的类.

Espresso 基本上由三个组成部分:

  • ViewMatchers - 在当前 View 层次结构中查找 View
  • ViewActions - 对这些 View 执行操作
  • ViewAssertions - 断言一个 View 的状态

Espresso 测试的基本结构如下:

onView(ViewMatcher)       
 .perform(ViewAction)     
   .check(ViewAssertion); 

① - 查找 View

② - 在这个 View上执行操作

③ - 验证断言

下面的代码演示了 Espresso 的基本用法:

@Test
public void espressoTest() {
    onView(withId(R.id.listview))            // withId(R.id.my_view) is a ViewMatcher
            .perform(click())               // click() is a ViewAction
            .check(matches(isDisplayed()));// matches(isDisplayed()) is a ViewAssertion
}

如果 Espresso 通过 ViewMatcher 没有找到这个 View, 它会将整个 View 的层次结构包含在错误消息中, 这对分析问题是非常有用的.如图所示:

not find view

引入Espresso

安装

使用 Android SDK 管理器安装 Android Support Repository.(如果已存在请忽略)

install

Gradle 配置

使用 Espresso 就需要将下列依赖添加到 build.gradle 文件中.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    testCompile 'junit:junit:4.12'

    // Android runner and rules support
    androidTestCompile 'com.android.support.test:runner:1.0.1'
    androidTestCompile 'com.android.support.test:rules:1.0.1'

    // Espresso support
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    // add this for intent mocking support
    androidTestCompile 'com.android.support.test.espresso:espresso-intents:3.0.1'
    // for async test
    implementation 'com.android.support.test.espresso:espresso-intents:3.0.1'

    // add this for webview testing support
    androidTestCompile 'com.android.support.test.espresso:espresso-web:3.0.1'
}

在build.gradle文件中要确保 android.support.test.runner.AndroidJUnitRunner 作为 testInstrumentationRunner 的参数, 你可能需要通过 packagingOptions 排除 LICENSE.txt , 但是这具体取决于你使用的库, 下面的这段代码就是一个示例.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion '22.0.1'
    defaultConfig {
        applicationId "com.example.android.testing.espresso.BasicSample"
        minSdkVersion 10
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    packagingOptions {
        exclude 'LICENSE.txt'
    }
    lintOptions {
        abortOnError false
    }
}

dependencies {
    // as before.......
}

配置设备

建议关闭用于测试的 Android 设备上的动画. 动画可能会混淆 Espresso 检查资源.

Close Animation

练习: 创建第一个 Espresso 测试

创建测试项目

创建一个新的 Android 项目用于做 Espresso 测试.使用 Android Studio 空白模板创建两个Activity.

创建 EspressoTest1Activity.并创建相应的activity_espresso_test1.xml 布局.

public class EspressoTest1Activity extends AppCompatActivity {
    EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_espresso_test1);
        editText = (EditText) findViewById(R.id.inputField);
    }
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.changeText:
                editText.setText("Lalala");
                break;
            case R.id.switchActivity:
                Intent intent = new Intent(this, EspressoTest2Activity.class);
                intent.setAction(Intent.ACTION_CALL);
                intent.setData(Uri.parse("123456789"));
                intent.putExtra("input", editText.getText().toString());
                startActivity(intent);
                break;
        }
    }
}

创建 EspressoTest2Activity.在 activity_espresso_test2.xml 布局文件中添加一个 TextView.

public class EspressoTest2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_espresso_test2);
        TextView viewById = (TextView) findViewById(R.id.resultView);
        Bundle inputData = getIntent().getExtras();
        if (inputData != null) {
            String input = inputData.getString("input");
            viewById.setText(input);
        }
    }
}

配置build.gradle 文件

请参照上面讲述的内容进行配置.

创建 Espresso 测试

src/android/test 目录下创建 EspressoTestActivityTest 类, 用于模拟输入文字和验证输入框文字的测试.

package com.lulu.androidtestdemo.espresso;

import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;

import com.lulu.androidtestdemo.R;

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.*;
import static android.support.test.espresso.matcher.ViewMatchers.*;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
 * Created by zhanglulu on 2018/3/5.
 */
@RunWith(AndroidJUnit4.class)
public class EspressoTestActivityTest {
    @Rule
    public ActivityTestRule<EspressoTest1Activity> mActivityRule =
            new ActivityTestRule<EspressoTest1Activity>(EspressoTest1Activity.class);
    @Test
    public void ensureTextChangesWork() {
        //输入文字, 并点击按钮
        onView(withId(R.id.inputField))
                .perform(typeText("HELLO"), closeSoftKeyboard());
        onView(withId(R.id.changeText)).perform(click());
        //检查输入框文字是否改变
        onView(withId(R.id.inputField)).check(matches(withText("Lalala")));
    }
}

运行测试

右击测试方法,选择运行该测试.

运行结果

效果图如下, 自动输入,自动点击.是不是特别神奇!

executeResult

敲行代码再睡觉

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013144863/article/details/79959741

Espresso——功能方法介绍

本文通过代码实例来分析Exprees的具体功能方法。 1、通过方法onView()可以获取某个控件这个对象,即ViewInteraction。 onView()有两个方法来获取对象: withT...
  • shandong_chu
  • shandong_chu
  • 2015-07-27 17:20:16
  • 2726

Espresso环境搭建及其基本使用

大家开发Java程序的时候可以使用JUnit进行程序的测试,现在有一款可以测试Android UI的框架,叫Espresso,在这,简单记录下环境搭建及其基本使用。...
  • Long_Fei_Jia_You
  • Long_Fei_Jia_You
  • 2016-06-15 16:39:04
  • 1383

Espresso 自动化测试(二)- 简单入门

在 Espresso 自动化测试(一) 中我们说过Espresso编写自动化就做三件事情:找某些东西、做某些事情、检查某些东西。下来我们就针对这三点,逐步来进行说明。 介绍我们先看看下面这张图找某些东...
  • qq744746842
  • qq744746842
  • 2016-02-03 09:02:57
  • 2319

Espresso——Android测试工具Espresso简介

本文通过网络文章来介绍Espresso的使用 Espresso是一个新工具,相对于其他工具,API更加精确。并且规模更小、更简洁并且容易学习。它最初是2013年GTAC大会上推出的,目标...
  • shandong_chu
  • shandong_chu
  • 2015-07-24 16:33:43
  • 3097

Android 自动化测试 Espresso篇:简介&基础使用

前言最近在尝试深入学习Android单元测试。以前笔者对于单元测试的理解很简单,做一个简单的API测试获取Server端数据,或者测试对应简单的工具类和数据处理的逻辑。经过这近一个月的碎片化学习,深深...
  • mq2553299
  • mq2553299
  • 2017-07-01 16:24:57
  • 1570

Android自动化测试--Espresso框架使用

且说正文之前,还是先说说Android单元测试的意义或者说为什么我们要进行Android的单元测试?为什么要进行单元测试?单元测试可以帮助我们程序员将bug消灭在萌芽期,为后续的集成测试减少时间.大家...
  • qiang_xi
  • qiang_xi
  • 2016-10-28 11:23:49
  • 8842

Espresso——实例分析

通过实例来分析Espreeso的使用 import static com.google.android.apps.common.testing.ui.espresso.Espresso.on...
  • shandong_chu
  • shandong_chu
  • 2015-08-07 10:39:18
  • 1425

Espresso 自动化测试(十)- RecyclerView

随着Android 5.x的普及,它的一些特性也在越来越多的APP中使用到,其中RecyclerView就是其中一个。RecyclerView 是一个像 ListView、GridVIew 那样呈现数...
  • qq744746842
  • qq744746842
  • 2016-02-17 21:39:24
  • 1561

Espresso指南一(Espresso下载、安装、设置、基础、速查表)

Espresso 像下面一样写简洁、优美、可靠的Android UI测试: @Test public void greeterSaysHello() { onView(withId(R.id.na...
  • nicolelili1
  • nicolelili1
  • 2016-10-19 17:07:33
  • 2185

Google I/O 2016 笔记之Espresso 进阶

Google I/O 2016 笔记之Espresso 进阶
  • u014608640
  • u014608640
  • 2016-09-14 10:09:41
  • 756
收藏助手
不良信息举报
您举报文章:初识Espresso
举报原因:
原因补充:

(最多只允许输入30个字)