初识Espresso

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

本篇内容介绍了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

敲行代码再睡觉

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页