您的位置:首页 > 移动开发 > Android开发

Android测试二----InstrumentationTestRunner运行测试用例机制

2015-08-10 22:17 691 查看
前面讲到am怎么启动cts的测试进程,接下来了解下测试用例是如何被运行的。

在Android的cts测试中,AndroidManifest.xml中的instrumentation实际配置的是InstrumentationCtsTestRunner,在该类中会做一些测试环境初始化操作。

我们这里直接从InstrumentationTestRunner开始讲:

1.InstrumentationTestRunner.java

首先进入onCreate方法:

// Apk paths used to search for test classes when using TestSuiteBuilders.
String[] apkPaths =
{getTargetContext().getPackageCodePath(), getContext().getPackageCodePath()};
ClassPathPackageInfoSource.setApkPaths(apkPaths);


这里getTargetContext拿到的是cts进程的上下文,getContext拿到的是测试用例所在包的context。

TestSuiteBuilder testSuiteBuilder = new TestSuiteBuilder(getClass().getName(),
getTargetContext().getClassLoader());


android中TestSuite相当于一个测试盒,里面可以有很多测试包、测试类,而这个TestSuite是通过TestSuiteBuilder来获取的。按照理解newTestSuiteBuilder对象的时候,第一个参数为当前类名,即InstrumentationTestRunner,表示生成的suite里面的测试用例都是跑在InstrumentationTestRunner中。第二个参数是类下载器,用来获得要测试的类。

parseTestClasses(testClassesArg, testSuiteBuilder);


分析相应的测试类中有哪些方法

mTestRunner = getAndroidTestRunner();
mTestRunner.setContext(getTargetContext());
mTestRunner.setInstrumentation(this);
mTestRunner.setSkipExecution(logOnly);
mTestRunner.setTest(testSuiteBuilder.build());
mTestCount = mTestRunner.getTestCases().size();
......
start()


这里就看到mTestRunner这个对象,android中其实就是通过它去运行测试用例的,上面就是对TestRunner设置一系列参数,让其能正确执行测试类中的测试用例。

另外,TestSuiteBuilder通过build()方法创建了相应的TestSuite

TestRunner设置自己要运行的Test

mTestCount记录了要运行的用例数量

最后执行start(),接着去运行onStart()

2.

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);


增加TestRunner中的结果打印的监听,通过这些打印会生成cts报告

通过TestRunner中的runTest方法去执行相应的用例

3.AndroidTestRunner.java

public void runTest(TestResult testResult) {
mTestResult = testResult;

for (TestListener testListener : mTestListeners) {
mTestResult.addListener(testListener);
}

Context testContext = mInstrumentation == null ? mContext : mInstrumentation.getContext();

for (TestCase testCase : mTestCases) {
setContextIfAndroidTestCase(testCase, mContext, testContext);
setInstrumentationIfInstrumentationTestCase(testCase, mInstrumentation);
setPerformanceWriterIfPerformanceCollectorTestCase(testCase, mPerfWriter);
testCase.run(mTestResult);
}
}
这里使用一个for循环,循环执行解析出来放在mTestCases中的测试用例, 同时我们会看到里面会根据测试用例的不同,调用不同的set方法进行设置, 然后才去执行run,结果放在mTestResult中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: