Android UI 测试框架Espresso详解

本文详细介绍了Android UI测试框架Espresso的使用,包括测试框架的安装配置、编写第一次测试、使用Intents模拟、自定义匹配器、功能测试及异步代码测试等。Espresso简化了UI测试过程,提供ViewMatcher、ViewActions和ViewAssertions,方便进行视图操作和状态验证。
摘要由CSDN通过智能技术生成

Android UI 测试框架Espresso详解

1. Espresso测试框架

2.提供Intents Espresso

2.1.安装

2.2.为Espresso配置Gradle构建文件

2.3.设备设置

3.练习:第一次Espresso测试

3.1.创建被测项目

3.2.调整应用程式build.gradle

3.3.创建您的Espresso测试

3.4.运行测试

4.有关编写Espresso单元测试的更多信息

4.1.Espresso测试的位置和所需的静态导入

4.2.使用ViewMatcher

4.3.执行动作

4.4.验证测试结果

4.5.访问检测API

4.6.配置Activity的开始意图

4.7.适配器视图

4.8.具有权限的Espresso测试

4.9.Espresso UI记录器

4.10.配置Activity

4.11.运行Espresso测试

4.12.检查Toast

5.用Intents EspressoIntents 模拟

6.练习:创建自定Espresso匹配器

7.练习:为Intents Espresso编写测试

7.1.创建经过测试的项目

7.2.编写测试

7.3.验证

8.练习:Activity的功能测试

8.1.编写Activity的功能测试

9.练习:使用Espresso测试异步代码


1. Espresso测试框架

Espresso是Android的测试框架,可简化编写可靠的用户界面测试的过程。

Google于2013年10月发布了Espresso框架。自其2.0版本以来,Espresso已成为Android支持存储库的一部分。

Espresso会自动将您的测试操作与应用程序的用户界面同步。该框架还确保您的Activity在测试运行之前就已经开始。它还让测试等到所有观察到的后台Activity都完成为止。

它旨在测试单个应用程序,但也可以用于跨应用程序进行测试。如果用于在应用程序外部进行测试,则只能执行黑盒测试,因为您无法访问应用程序外部的类。

Espresso基本上具有三个组成部分:

  • ViewMatchers-允许在当前视图层次结构中查找视图

  • ViewActions-允许对视图执行操作

  • ViewAssertions-允许声明视图状态

Espresso测试的案例构造如下:

Espresso测试

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

onView

-查找视图

perform

-对视图执行操作

check

-验证断言

 

以下代码演示了Espresso测试框架的用法。

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;

// image more code here...

// test statement
onView(withId(R.id.my_view))            // withId(R.id.my_view) is a ViewMatcher
        .perform(click())               // click() is a ViewAction
        .check(matches(isDisplayed())); // matches(isDisplayed()) is a ViewAssertion

// new test
onView(withId(R.id.greet_button))
.perform(click())
.check(matches(not(isEnabled()));

如果Espresso无法通过找到一个视图ViewMatcher,则它将整个视图层次结构包含在错误消息中。这对于分析问题很有用。

2.提供Intents Espresso

2.1.安装

使用Android SDK管理器安装Android支持存储库。

2.2.为Espresso配置Gradle构建文件

要使用Espresso进行测试,请将以下依赖项添加到应用程序的Gradle构建文件中。

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

    testImplementation 'junit:junit:4.12'

    // Android runner and rules support
    androidtestImplementation 'com.android.support.test:runner:0.5'
    androidtestImplementation 'com.android.support.test:rules:0.5'

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

    // add this for intent mocking support
    androidtestImplementation 'com.android.support.test.espresso:espresso-intents:2.2.2'

    // add this for webview testing support
    androidtestImplementation 'com.android.support.test.espresso:espresso-web:2.2.2'

}

确保在您的应用的构建文件中将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.......
}

 

2.3.设备设置

建议在用于测试的Android设备上打开动画。动画可能会使Espressos检查资源浪费。

3.练习:第一次Espresso测试

3.1.创建被测项目

创建一个名为Espresso First的新Android项目,包名称为com.vogella.android.espressofirst。使用空白模板作为该项目的基础。

将生成的activity_main.xml布局文件更改为以下内容。

<LinearLayout 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"
    >

    <EditText
        android:id="@+id/inputField"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/changeText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button" android:onClick="onClick"/>

    <Button
        android:id="@+id/switchActivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Change Text" android:onClick="onClick"/>
</LinearLayout>

创建一个名为activity_second.xml的新文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/resultView" />
</LinearLayout>

使用以下代码创建一个Activity。

package com.vogella.android.espressofirst;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class SecondActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        TextView viewById = (TextView) findViewById(R.id.resultView);
        Bundle inputData = getIntent().getExtras();
        String input = inputData.getString("input");
        viewById.setText(input);
    }
}

同时调整MainActivity。

package com.vogella.android.espressofirst;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {

    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        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, SecondActivity.class);
                intent.putExtra("input", editText.getText().toString());
                startActivity(intent);
                break;
        }

    }
}

3.2.调整应用程式build.gradle

按照Espresso的Gradle构建文件的配置中所述执行设置。

3.3.创建您的Espresso测试

package com.vogella.android.espressofirst;

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

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

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 MainActivityEspressoTest {


    @Rule
    public ActivityTestRule<MainActivity> mActivityRule =
        new ActivityT
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值