An instrumention test runner is not specified
单击“Android JUnit Test”运行后,出现“An instrumention test runner is not specified ”错误提示,如下:
同时,在程序的console面板中会输出如下信息:
ERROR: Application does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-library android.test.runner。
出现错误的原因可能是:AndroidManifest.xml配置错误。那么在AndroidManifest.xml到底需要配置哪些内容呢,下面一一为大家说明:
- 在<application>增加引用android.test.runner的声明,如下图所示:
- 然后在<manifest>中增加instrumentation的信息说明,如下图所示:
- 最后还需要增加uses-permission声明,如下图所示:
根据自己的程序,在AndroidManifest.xml文件中配置上面的信息。如果上面的信息配置正确,鼠标右键单击工程,选择Run As/Run configurations,在Android JUnit Test选项中选择工程,将会看到下面这个界面:
在Instrumentation runner后的列表框选项中,我们看到android.test.InstrmentationTestRunner,并处于当前选择状态。如果这个没有选择框中没有任何选项,就说明AndroidManifest.xml配置有问题。
如果你确信自己的配置没有问题,而且上面的界面显示也没有任何问题,但是运行却出现下面这个错误提示:
这个提示出现的原因,在JUnit 的FAQ中有对这个错误的说明,这里我也不知道是不是这个原因导致的错误,JUnit FAQ中是这么说明的:
Why do I get the warning “AssertionFailedError: No tests found in XXX” when I run my test?
Make sure you have more or more method annotated(有注解的) with @Test.
For example:
@Test
public void testSomething() {}
这个错误在提示我们:当前的test runner没有任何Test。在我们的package中包含有不少的TestCase,一切也都是按照Android SDK中的设置来编写的代码,出现这个错误实在是莫名其妙,但是有一点可以说明的,当前这个单元测试有问题。
即使是Android SDK中的例子程序运行也存在这个问题,我运行ApiDemos/test中的JUnit测试单元,也一直存在这样那样的问题。在学习到了前面的这些知识后,按照Android SDK中的规范,自己写个JUnit测试程序,步骤如下:
首先,从InstrmentationRunner继承,实现我们的自己的Instrument
public class MoandroidTestRunner extends InstrumentationTestRunner
{
@Override
public TestSuite getAllTests()
{
}
@Override
public ClassLoader getLoader()
{
return MoandroidTestRunner.class.getClassLoader();
}
}
然后,将这个TestCase添加到TestSuite中,并将TestSuite返回到MoandroidTestRunner
public TestSuite getAllTests()
{
InstrumentationTestSuite suite = new InstrumentationTestSuite(this);
suite.addTestSuite(ForwardingTest.class);
return suite;
/*—更加简单的方法
return new TestSuiteBuilder(ApiDemosRunner.class)
.includeAllPackagesUnderHere()
.build();
*/
}
最后,按照前面说的步骤,配置AndroidManifest.xml文件
这里需要说明的,我们创建了自己的Instrumentation,在配置要将Instrumentation的android:name属性设置为我们自己的MoandroidTestRunner(别忘了还需要加上包名)。
按照上面的方法,创建JUnit测试单元后,分别在Eclipes中、Dev Tool中Instrumentation、adb shell am –w 命令启动,应该就可以看到测试运行了。看来这多的例子程序,实际上JUnit单元测试的核心就是:TestCase、TestSuite,无论Android SDK 再此基础上怎么扩展,只要我们能了解这个核心,所有的变化也就是锦上添花而已。
这里我将ApiDemos中的测试单元修改后,上传博客与大家分享,下载测试例子程序,主要修改说明如下:
- 去掉了其自身包含的test子文件,在src/com/example/android/apis包下创建一个test子包,其包含所有的测试代码,如下图所示:
- 手工修改配置文件AndroidManifest.xml
在Eclipes中选择工程,单击右键,在Run as/Debug as子菜单选项中选择Android JUnit Test,JUnit测试界面就会显示测试过程了。
补充说明
在Android SDK的troubleshooting页面中也说明了一个可能出现的错误,原文如下:
If you are developing on Eclipse/ADT, you can add JUnit test classes to your application. However, you may get an error when trying to run such a class as a JUnit test:
Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/ref/FinalReference
这个错误的主要原因是android.jar并没有完全包含Junit.* 类,只是包含了部分类,至于如何修改这个错误,还是到Android SDK 中去查看具体的办法吧。