包的名称似乎就在告诉我们这个包的作用:suite产生器,其包结构如下:
从这个图上似乎没有看到我们想要的,下面我们再仔细看下TestSuiteBuilder这个类:
通过上面的关键字:Exclude(排除; 不包括在内),Include(包括, 包含),the given packages and all sub-package(给定的包和所有子包),这些都让我们感觉到TestSuiteBuilder类的主要作用是:将包添加或排除在当前的单元测试中。大家是不想起来了如何启动单元测试篇幅中介绍的启动命令:
adb shell am instrument -w com.xmobileapp.hello/android.test.InstrumentationTestRunner这条命令的实际作用是是将com.xmobileapp.hello添加到当前单元测试中,在这里我们在列举一些这样的命令,如下:
adb shell am instrument -w -e class com.android.foo.FooTest com.android.foo/android.test.InstrumentationTestRunner运行一个TestCase中的某个功能:
adb shell am instrument -w -e class com.android.foo.FooTest#testFoo com.android.foo/android.test.InstrumentationTestRunner同时测试多个TestCase:
adb shell am instrument -w -e class com.android.foo.FooTest,com.android.foo.TooTest com.android.foo/android.test.InstrumentationTestRunner看了这些命令,再结合TestSuiteBuilder的函数,我想大家就明白了一个重要的问题:在AndroidManifest.XML文件Instrumentation的属性(如下图所示)中为什么没有任何与TestSuite相关的说明?
单元测试的配置已经取代了TestCase的管理,所以TestSuite的功能就弱化了很多,TestSuiteBuilder就是在我们提供当前测试的测试范围的配置,例如:是否将某个TestCase添加到当前测试中。TestSuiteBuilder类的函数builder就根据的我们的配置产生TestSuite。看到这里我们的的疑惑就少了很多,下面我们继续介绍InstrumentationTestRunner类。
InstrumentationTestRunner 类结构,如下图所示:
主要函数接口列举如下:
InstrumentationTestRunner典型的使用过程:
看了上面的命令,我们在看下ApiDemos\test\…\AllTests.java中的一些注释,如下:
大家就应该明白这些注释说的是什么意思了吧,这篇文章的目的也就达到了。
下面介绍一个简要的例子:
public class ApiDemosRunner extends InstrumentationTestRunner { @Override public TestSuite getAllTests() { Log.i(“ApiDemosRunner”, “ApiDemosRunner::getAllTests()”); return new TestSuiteBuilder(ApiDemosRunner.class) .includeAllPackagesUnderHere() .build(); } @Override public ClassLoader getLoader() { return ApiDemosRunner.class.getClassLoader(); } }
参考资料: