Android的测试框架相关的API主要定义在三个包中:
- android.test 用于编写Android测试用例
- android.test.mock 定义了方便测试用的测试“桩”类
- android.test.suitebuilder 运行测试用例的Test Runner类
Android 测试API 是基于JUnit 扩展而来,并添加了与Android平台相关的测试API。
JUnit
你可以直接使用JUnit中相关API编写一些和平台无关的测试用例(基于TestCase), Android 测试API中提供了一个TestCase的子类AndroidTestCase ,可以用来编写一些Android相关的对象的测试用例,AndroidTestCase 支持一些和平台相关的setup,teardown 以及setup 方法。
你也可以直接使用JUnit 的Assert 方法 显示测试结果,这些Assert方法可以通过比较预期的值和实际的值,如果不同可以排除异常。Android 测试API扩展了一些Assert方法用于支持和Android平台相关的比较。
要注意的是,Android 测试API支持JUnit 3 代码风格,而不支持JUnit 4 代码风格,也只能使用InstrumentationTestRunner 来运行测试用例。
Instrumentation
Android 的Instrumentation 提供了一些“钩子”方法连接到Android操作系统中,可以独立控制Android组件(Activity,Service等)的生命周期,并可以控制Android如何调用一个应用。
在通常情况下(普通的Android应用),Android的activity,Service等的生命周期是由
Android操作系统来控制的。 比如一个Activity 的生命周期开始于onCreate (由某个Intent激活),然后是onResume. 可以参见Android简明开发教程五:Activities。 应用程序本身无法直接控制这些生命周期状态的切换。但使用Instrumatation API时你可以直接调用这些方法。
Instrumentation API 也可以支持强制某个应用和另一个已经在运作的应用运行在同一个进程中,这在通常的情况下是不可能实现的。
使用Instrumentation API 你可以直接调用Activity或是Service的生命周期回调函数,从而可以让你运行一步一步的运行Activity或是Service的生命周期函数。如下例显示了如何使用Instrumentation API来测试Activity 保持和恢复State。
// Start the main activity of the // application under test mActivity = getActivity(); // Get a handle to the Activity object's //main UI widget, a Spinner mSpinner = (Spinner)mActivity .findViewById(com.android.example.spinner.R.id.Spinner01); // Set the Spinner to a known position mActivity.setSpinnerPosition(TEST_STATE_DESTROY_POSITION); // Stop the activity - The onDestroy() //method should save the state of the Spinner mActivity.finish(); // Re-start the Activity - the onResume() //method should restore the state of the Spinner mActivity = getActivity(); // Get the Spinner's current position int currentPosition = mActivity.getSpinnerPosition(); // Assert that the current position is the //same as the starting position assertEquals(TEST_STATE_DESTROY_POSITION, currentPosition);
其中关键的一个方法是getActivity(),只有调用getActivity()后被测试的activity才会启动。此外Instrumentation API允许把测试项目和被测试的应用项目运行到同一个进程中,从而在测试代码中可以直接调用被测试应用的方法和访问其成员。
Test case 相关类
Android提供了多个由Testcase或Assert派生而来的子类以支持Android平台相关的setup,teardown 和其它辅助方法。
- AndroidTestCase 为一Android平台下通用的测试类,它支持所有JUnit的Assert方法和标准的setUp 和tearDown 方法,并可以用来测试Android permission 。
- 组件相关的测试类如测试activity, Content provider ,Service 相关的测试类,Android没有提供单独的用来测试BroadcastReceiver 的测试类,而是可以通过发送Intent对象来检测Broadcast Receiver的反应结果来测试BroadcastReceiver。
- ApplicationTestCase 可以用来测试Application 对象。
- InstrumentationTestCase 如果你要使用Instrumentation API,那么你必须使用InstrumentationTestCase或其子类。
Assertion classes
Android测试中可以使用JUnit中提供的Assert方法来显示测试结果。除此之外,Testing API还提供了MoreAsserts 和ViewAsserts 类。其中MoreAsserts支持更多的比较方法包括RegEx(正则)比较等。ViewAsserts 可以用来校验UI View。
Mock object classes
android.test.mock 包中定义一些测试“桩”类,如MockApplication,MockContentProvider ,MockContext,MockCursor, MockPackagManager等用例帮助测试。
后面将具体介绍如何使用这些API来编写测试用例。