2013 GTAC谷歌介绍了Android平台自动化测试框架“Espresso”(Video, Slides),10月18号谷歌正式开放“Espresso”,使用Espresso可以写出简洁,漂亮并且可靠的Android UI测试。例如:
@Test
public void greeterSaysHello() {
onView(withId(R.id.name_field)).perform(typeText("Steve"));
onView(withId(R.id.greet_button)).perform(click());
onView(withText("Hello Steve!")).check(matches(isDisplayed()));
}
Google Espresso
自动化测试对开发人员来说很重要,它不但可以节省时间,也可以减少我们犯错的概率。
当然最重要的还是那句话 不会偷懒的程序猿,不是好程序猿。
Google推荐在测试的时候关闭设备的System animations,不论你用的是模拟器或者是真机。
关闭System animations,进入“设置”->“开发者选项”,找到以下三个选项并关闭。
进入SDK Manager下载Android Support Repository,下载完成之后,就可以在Android Studio中module下的build.gradle文件中配置以下代码,其中的版本号,视情况而定。
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile 'com.android.support.test:runner:0.5'
然后在build.gradle中android下继续配置defaultConfig,完整配置如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22"
defaultConfig {
applicationId "com.my.awesome.app"
minSdkVersion 10
targetSdkVersion 22.0.1
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
dependencies {
// App's dependencies, including test
compile 'com.android.support:support-annotations:22.2.0'
// Testing-only dependencies
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
}
这里只是一个最基本的案例,具体更多的使用方法,可以查看Google的官方文档Espresso。
新建一个Activity,编写好基本的代码。
public class MainActivity extends AppCompatActivity {
TextView mTextName;
EditText mEditName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextName = (TextView) findViewById(R.id.text_name);
mEditName = (EditText) findViewById(R.id.edit_name);
findViewById(R.id.btn_ok).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sayHello();
}
});
}
public void sayHello() {
mTextName.setText("Hello, " + mEditName.getText().toString().trim() + "!");
}
}
如下图
布局代码就不在这里贴出来了。然后在androidTest包下新建一个测试类,代码如下
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.LargeTest;
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.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityInstrumentationTest {
@Rule
public ActivityTestRule mActivityRule = new ActivityTestRule<>(
MainActivity.class);
@Test
public void sayHello() {
onView(withId(R.id.edit_name)).perform(typeText("world"), closeSoftKeyboard());
onView(withId(R.id.btn_ok)).perform(click());
String expectedText = "Hello, world!";
onView(withText(expectedText)).check(matches(isDisplayed()));
}
}
其中代码都很好理解,简单易懂。编写相应的测试类,也不会给我们增加多少工作量,反而会帮我们省下很多的测试时间。
onView(withId(R.id.edit_name)).perform(typeText("world"), closeSoftKeyboard());
这段代码的意思就是找到id为edit_name的view,并且执行输入操作,输入的值为world,输入完成之后关闭软键盘。其他代码类似,不一一赘述。
编写完测试类之后就要运行起来看一看效果如何了。接下来要新建一个test configuration。步骤如下:
指定instrumentation runner
android.support.test.runner.AndroidJUnitRunner
新建完之后,即可运行刚刚新建的配置了。在Android Studio中选择好相应的module启动即可。
可以看到,程序自动运行并且自动输入相应的值,执行相应的操作。此时在Android Studio中打印的log信息如下:
测试已经全部通过了,当然我们也这里也只有一个测试方法,可以写多个方法并加上 @Test 注解,就可以一次运行多个方法了。