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

来源:互联网 发布:网络舆情监测 编辑:程序博客网 时间:2024/06/07 11:06

前面讲到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中。

0 0
原创粉丝点击