初识Espresso

作者: changer0 | 来源:发表于2018-04-14 14:11 被阅读24次

    本篇内容介绍了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 敲行代码再睡觉

    相关文章

      网友评论

        本文标题:初识Espresso

        本文链接:https://www.haomeiwen.com/subject/gellkftx.html