Android 内置测试框架是基于 Junit3
通过 IDE 创建测试项目就好,自己搞要参照文档.主要配置就是AndroidManifest.xml
<instrumentation
android:name="android.test.InstrumentationTestRunner" // 指定 Runner
android:targetPackage="com.example.demo" /> // 要测试的包
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="android.test.runner" /> // 还有这个
</application>
测试相关的类都在 android.test
包下,主要的测试框架如下,都扩展自 TestCase
从类名可以看出个大概
AndroidTestCase 下基本都是与ui无关的,分别针对 Application、Loader、Provider、Service
InstrumentationTestCase 下则是 Activity 相关的,它提供了Instrumentation接口给TestCase的子类。 为了支持Activity测试,InstrumentationTestCase提供了生命周期控制,你可以启动,暂停,中止被测试的Activity。还有一些Mock对象如Context,Application来帮助测试Activity,从而帮助你控制测试环境并和实际的应用的其他部分隔离开来,以及一些UI事件。
- ActivityTestCase
Activity 测试的通用部分,主要用下面两个子类 - ActivityInstrumentationTestCase2
使用的是app本身测试,不是mock对象,可用于多Activity交互
You can run any test method on the UI thread (see UiThreadTest).
You can inject custom Intents into your Activity (see setActivityIntent(Intent)). - ActivityUnitTestCase
通常用来测试单独Activity。在启动被测试的Activity之前,你可以Inject一个假的Context或是Application ,使用这个Mock的Context中一个隔离环境中运行被测试的Activity。通常用于Activity的单元测试,而不和Anroid系统进行交互。 - SingleLaunchActivityTestCase
用于测试单个Activity,和ActivityUnitTestCase不同的是,它只运行setUp 和tearDown 一次,而不是在运行testCase 中每个Test Method前后运行setup 和tearDown ,它可以保证运行多个测试之间fixture 不会被重置,从而可以用来测试一些有关联的方法。 - SyncBaseInstrumentation
测试Content Provider同步性的类。它使用Instrumentation在启动测试同步性之前取消已经存在的同步对象。
一个简单的 Demo
IDE:Eclipse
先创建普通Android项目Demo
,再创建测试项目DemoTest
,指定测试目标为 Demo,Eclipse 会自动配好 Manifest
写两个需要测试的内容,一个 Activity,一个 Activity 无关的工具类
Demo MainActivity
public class MainActivity extends Activity {
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button1);
textView = (TextView) findViewById(R.id.textView1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
textView.setText("hehe");
}
});
}
}
Demo StringUtils
public class StringUtils {
// ...
public static String get(String url){
return url;
}
}
DemoTest 里 MainActivityTest 用于测试 MainActivity,测试按钮点击后 TextView的值是否正确
public class MainActivityTest extends
ActivityInstrumentationTestCase2<MainActivity> {
public MainActivityTest() {
super(MainActivity.class);
}
public MainActivityTest(Class<MainActivity> activityClass) {
super(activityClass);
}
private MainActivity mainActivity;
@Override
protected void setUp() throws Exception {
super.setUp();
mainActivity = getActivity();
}
public void testPre() {
assertNotNull(mainActivity);
}
public void testBtnClick() {
final Button button = (Button) mainActivity.findViewById(R.id.button1);
TextView textView = (TextView) mainActivity
.findViewById(R.id.textView1);
assertNotNull(button);
mainActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
button.performClick();
}
});
// 代码跑太快…等等界面反应
SystemClock.sleep(1000);
assertEquals("hehe", textView.getText());
}
}
DemoTest StringUtilsTest
public class StringUtilsTest extends AndroidTestCase{
public void testGet(){
assertEquals("a", StringUtils.get("a"));
}
}
然后 Run As -> Android JUnit Test
其他测试相关类
android.mock 下是一些 mock 类
ViewAsserts、MoreAsserts、TouchUtils 在测试的时候都会用到。