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

android集成测试框架 android测试框架有哪些_Android

从类名可以看出个大概

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 在测试的时候都会用到。