Android Unit Test Without Emulator

项目地址

http://robolectric.org/

项目介绍

想直接在Android IDE中运行andorid test?会得到如下结果:

java.lang.RuntimeException: Stub!

如果引入了TDD的开发模式,在android中就需要不停启动关闭emulator,因为ide没有办法直接模拟运行android test cases,所有才有了Robolectric方案:

示例App

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

<Button
android:id="@+id/login"
android:text="Login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
  1. main activity
public class WelcomeActivity extends Activity {
@Overrid
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome_activity);

final View button = findViewById(R.id.login);
button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View view) {
startActivity(new Intent(WelcomeActivity.this, LoginActivity.class));
}
});
}
}

测试用例,直接在ide里执行

@RunWith(RobolectricTestRunner.class)
public class WelcomeActivityTest {
@Test
public void clickingLogin_shouldStartLoginActivity() {
WelcomeActivity activity = Robolectric.setupActivity(WelcomeActitity.class);
activity.findViewById(R.id.login).performClick();
Intent expectedIntent = new Intent(activity, WelcomeActivity.class);
assertThat(shadowOf(activity).getNextStartedActivity()).isEqualTo(expectedIntent);
}
}

Android Unit Test Framework Review

Robolectric

网址:http://robolectric.org/

现在比较流行的测试框架,主要特点是:

  • 对所有的内生的方法、SDK、资源进行模拟,不需要模拟器
  • 不需要mock框架
  • 可以直接在IDE中运行

示例:

@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {

@Test
public void clickingButton_shouldChangeResultsViewText() throws Exception {
MyActivity activity = Robolectric.setupActivity(MyActivity.class);

Button button = (Button) activity.findViewById(R.id.button);
TextView results = (TextView) activity.findViewById(R.id.results);

button.performClick();
assertThat(results.getText().toString()).isEqualTo("Robolectric Rocks!");
}
}

Espresso

网址:https://google.github.io/android-testing-support-library/docs/espresso/index.html

是Google提供一个UI测试框架,本身是用来做黑盒测试,但是用于Unit Testing也是很方便,它的特点是:

  • 运行于真实的设备中或者模拟器中
  • 速度可靠性较好
  • 但是需要Android的开发能力较高一点

Android Junit Runner

网址:https://google.github.io/android-testing-support-library/docs/androidjunitrunner-guide/index.html

是android里面最基础的测试框架,它的特点是:

  • 支持Junit4语法
  • Instrumentation Registry
  • Test Filter
  • Test Timeout
  • Sharding of tests
  • RunListener supporting the testing cycle
  • Activity and Applicatioon life cycle monitoring
  • Intent Monitoring and Stubbing

Android Junit Runner with ATSL

网址:https://google.github.io/android-testing-support-library/docs/rules/index.html

是android里面最基础的测试框架,它的特点是:

  • 除了上面的之外还有很多Rules
    • ActivityTestRules
    • ServiceTestRules

UI Automator

网址:https://google.github.io/android-testing-support-library/docs/uiautomator/index.html

是android提供的最底层的测试框架,它的特点是:

  • 主要支持UI测试
  • 可以跨APPs测试,比如经典的P2P测试(Driver->Host->User)
  • 不能测试hybrid view,可以使用espresso替代

Accessibility Checking

网址:https://google.github.io/android-testing-support-library/docs/accesibility-checking/index.html

是android用来检查view的可访问性的,比如是否可以点击或者是否可以使用一些助听设备等,可以使用的测试框架包括:

  • AndroidJunit
  • Espresso