Android 单元测试框架

来源:互联网 发布:可以注销淘宝店铺吗 编辑:程序博客网 时间:2024/05/16 12:51

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

0 0