Android测试用例执行线程和UI线程

发表于:2015-3-03 13:37

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yanlinwang    来源:51Testing软件测试网采编

  设置线程的运行级别,然后调用onStart方法。由于是通过InstrumentationTestRunner对象进入的调用,并且在InstrumentationTestRunner中对Instrumentation的onStart方法进行了重写,所以调用的是InstrumentationTestRunner的onStart方法,所以这时对onStart方法的执行是在新生成的“Instr: android.test.InstrumentationTestRunner”线程中。onStart代码如下
@Override
public void onStart() {
prepareLooper();
if (mJustCount ) {
mResults.putString(Instrumentation. REPORT_KEY_IDENTIFIER , REPORT_VALUE_ID );
mResults.putInt( REPORT_KEY_NUM_TOTAL , mTestCount );
finish(Activity. RESULT_OK , mResults );
} else {
if (mDebug ) {
Debug. waitForDebugger();
}
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PrintStream writer = new PrintStream(byteArrayOutputStream);
try {
StringResultPrinter resultPrinter = new StringResultPrinter(writer);
mTestRunner .addTestListener(resultPrinter);
long startTime = System.currentTimeMillis();
mTestRunner .runTest();
long runTime = System.currentTimeMillis() - startTime;
resultPrinter.print( mTestRunner .getTestResult(), runTime);
} catch (Throwable t) {
// catch all exceptions so a more verbose error message can be outputted
writer.println(String. format( "Test run aborted due to unexpected exception: %s",
t.getMessage()));
t.printStackTrace(writer);
} finally {
mResults.putString(Instrumentation. REPORT_KEY_STREAMRESULT ,
String. format( "\nTest results for %s=%s",
mTestRunner .getTestClassName(),
byteArrayOutputStream.toString()));
if (mCoverage ) {
generateCoverageReport();
}
writer.close();
finish(Activity. RESULT_OK , mResults );
}
}
}
  这主要是执行测试用例,收集结果了。这也就解释了为什么测试用例执行的线程与activity运行线程不一致的了。那activity运行的线程呢?onStart方法最后调用了finish,代码如下
public void finish(int resultCode, Bundle results) {
if (mAutomaticPerformanceSnapshots ) {
endPerformanceSnapshot();
}
if (mPerfMetrics != null) {
results.putAll( mPerfMetrics );
}
mThread.finishInstrumentation(resultCode, results);
}
  其中有对mThread对象的使用,这是一个ActivityThread类型的对象,是Instrumentation类的私有属性,在Instrumentation类的init方法中,有对mThread字段的赋值,并且只在这里有对mThread字段的赋值操作,猜测它就代表着activity运行所在的线程,也就是UI thread。所以反推,init方法应该在OnCreate方法调用之前。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号