在做Android的AsyncTask测试的时候,发现测试用例
在执行的时候是在一个名为“Instr: android.test.InstrumentationTestRunner”的线程中执行的,而activity是在main线程,个人这里也将其理解成UI线程。对此的原因做一些探究。
在Android测试工程的AndroidManifest.xml文件中,instrumentation标签的内容一般如下
<
instrumentation
android:name
=
"android.test.InstrumentationTestRunner"
android:targetPackage
=
"xxxxxx"
/>
在进行测试的时候是通过android.test.InstrumentationTestRunner来运行的。这个类的父类是android.app.Instrumentation,也就是常说的Instrumentation类了。与Android中activity的生命周期类似,也是通过调用InstrumentationTestRunner的onCreate方法来开始测试的执行,onCreate中有下图所示的一部分代码
前面部分主要是环境解析,加载测试类和测试用例的一些操作,可以理解通过前面的操作在testSuiteBuilder中已经保存测试类和测试用例的全部信息,然后是通过getAndroidTestRunner方法获得一个运行测试用例的AndroidTestRunner对象,然后是对mTestRunner的一些设置。关键是最后的start方法的调用。这个方法是继承自android.app.Instrumentation类,代码如下图
在其中生成了一个新的InstrumentationThread线程对象,并且启动了这个线程,由于是通过android.test.InstrumentationTestRunner对象来调用此方法的,因此getClass().getName()的返回结果就是字符串"android.test.InstrumentationTestRunner",所以这个新线程名就是“Instr: android.test.InstrumentationTestRunner”。再看InstrumentationThread类的源代码,这是一个Instrumentation的内部类,如下图所示
设置线程的运行级别,然后调用onStart方法。由于是通过InstrumentationTestRunner对象进入的调用,并且在InstrumentationTestRunner中对Instrumentation的onStart方法进行了重写,所以调用的是InstrumentationTestRunner的onStart方法,所以这时对onStart方法的执行是在新生成的“Instr: android.test.InstrumentationTestRunner”线程中。onStart代码如下
@Override
public
void