阅读本文大约需要2.33333分钟
根据官方的说法 ,
Android instrumentation is a set of control methods or hooks in the Android system. These hooks control an Android component independently of its normal lifecycle. They also control how Android loads applications.
Android Instrumentation是Android系统里面的一套控制方法或者”钩子“。这方法,可以用来独立地控制某个组件的生命周期。它们同时可以控制Android如何加载应用程序。
一般来说,Android中组件的生命周期是由系统来控制的。
比如,我们通过Intent启动了一个Activity,那么Activity的生命周期方法会自动被调用。首先,该Activity对象的onCreate()方法就会被调用,紧跟着就是onResume();当用户启动另外一个应用时,则该Activity的onPause()方法被调用;如果该Activity的代码调用了finish()方法,那么onDestroy()方法也随即被调用。
Android APIs并没有提供入口让我们直接去调用这些生命周期方法,但是如果通过Instrumentation就可以轻松做到这一点。
再者,操作系统将一个应用的所有控件都运行在同一个进程里。我们可以允许一些控件运行在不同的进程中,比如Content Providers;但是我们无法将一个应用和另外一个已经在运行的应用运行在同一个进程中。
使用了Instrumentation,我们就可以在测试代码中调用这些生命周期的回调函数。这将允许我们就像在调试该控件一样,一步一步地把该控件的整个生命周期运行一遍。以下代码片段将会演示如何使用Instrumentation来控制一个Activity保存和恢复其状态的测试:
// 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);
这里用到的关键方法是Instrumentation API里面的getActivity(),该被测的Activity在我们没有调用此方法的时候是不会启动的。我们也可以先把测试需要的环境配置好,然后再调用此方法来启动该Activity。
同时,Instrumentation可以将要测试的APP以及其对应的test Package加载到同一个进程中。由于我们所要测试的组件和其测试用例都运行在同一进程,因此我们就可以在我们的测试用例中直接调用组件的方法,对组件做一系列访问和修改。