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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值