初识Espresso
本篇内容介绍了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.(如果已存在请忽略)
installGradle 配置
使用 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 敲行代码再睡觉