Android 测试技能发展Android测试笔记Android单元测试

初识Espresso

2018-04-14  本文已影响24人  changer0

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

Espresso测试框架介绍

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

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

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

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

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

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 敲行代码再睡觉
上一篇下一篇

猜你喜欢

热点阅读