2014-02-24 10 views
1

我觉得围绕如何使用JUnit测试Android库项目存在很多困惑。
我将描述迄今为止我遇到的所有错误(为了其他程序员试图做同样的事情),最后我会指定我最后一个和当前的问题。试图使用JUnit测试库的考验

  1. 由于图书馆不是一个应用程序,它不会在bin目录产生.apk文件,只是一个.jar文件,,你需要一个.apk使用Android的JUnit测试

  2. 所以您肯定需要为测试创建一个新项目,请按照this guide
    注意:即使指南告诉您使用TestCase及其派生类AndroidTestCase,但有几篇帖子似乎指出TestCase仅用于JUnit3测试,JUnit4测试不会扩展任何类。
    我不知道当我想要运行一个使用Android API的测试时,如果你想在JUnit4下使用它,我还没有达到那个点。

  3. 对于不使用Android API的测试,请使用JUnit4样式类。如果您仅按照指南进行操作,则测试将失败“值为无效布局...”。这是因为运行配置包括Android的类路径。转至测试的JUnit测试运行配置(右键单击测试 - >属性 - >运行/调试设置 - >编辑),然后从classPath boostrap条目中移除Android。
    编辑
    当你首次运行时间的考验,在Eclipse中,你要选择,如果你选择了Android启动,无需使用哪种启动“Eclipse的JUnit的启动器”或“Android的JUnit测试启动器”删除引导条目。

  4. 从现在开始我没有成功。对于使用Android API的测试,请扩展AndroidTestCase。这些测试将需要更长的时间才能启动,即使您不是测试应用程序本身,也需要运行仿真程序,但是没有用户界面的实用程序类。

  5. 要运行Android UNIT大小写测试,启动程序将查找库目标项目没有的目标程序包APK文件。

  6. 当您按照#2中的指南进行操作时,目标软件包会自动插入测试项目的清单中。在测试项目清单应该是这样的:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.Common.lib.test" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="14" /> 

    <instrumentation 
     android:name="android.test.InstrumentationTestRunner" 
     android:targetPackage="com.Common.lib" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <uses-library android:name="android.test.runner" /> 
    </application> 

</manifest> 

这里,目标包是我想测试库。给出了一个解决方案in this post它将测试项目作为具有APK的应用程序使用。所以,现在我改变了目标包从

 android:targetPackage="com.Common.lib" /> 

 android:targetPackage="com.Common.lib.test" /> 

但仍然发射查找图书馆APK,即使我添加了图书馆作为参考测试项目,请参阅下面的logcat(注意CommonLibTest.apk已成功加载):

[2014-02-24 16:17:50 - CommonLibTest] Dx 
trouble writing output: already prepared 
[2014-02-24 16:17:51 - CommonLibTest] ------------------------------ 
[2014-02-24 16:17:51 - CommonLibTest] Android Launch! 
[2014-02-24 16:17:51 - CommonLibTest] adb is running normally. 
[2014-02-24 16:17:51 - CommonLibTest] Performing android.test.InstrumentationTestRunner JUnit launch 
[2014-02-24 16:17:51 - CommonLibTest] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'Phone-x86-jb' 
[2014-02-24 16:17:51 - CommonLibTest] Uploading CommonLibTest.apk onto device 'emulator-5554' 
[2014-02-24 16:17:52 - CommonLibTest] Installing CommonLibTest.apk... 
[2014-02-24 16:17:52 - CommonLibTest] Success! 
[2014-02-24 16:17:52 - CommonLib] Could not find CommonLib.apk! 
[2014-02-24 16:17:52 - CommonLibTest] Launching instrumentation android.test.InstrumentationTestRunner on emulator-5554 
[2014-02-24 16:17:53 - CommonLibTest] Test run failed: Instrumentation run failed due to 'java.lang.ClassNotFoundException' 

这就是我得到的。
如果想要相信某人已经使用JUnit成功地测试了一个库项目并解决了我的问题。

回答

1

为了完成故事,我解决了最后一个障碍,现在测试运行。
让我们从底线开始:

AndroidTestCase需要JUnit3测试。注释@Test对于org.junit.Test类未通过ClassNotFound测试。

一旦我注释掉所有@Test注释,测试开始运行。 另一个指导原则:测试名称应以JUnit3的前缀“测试”开头

奇怪的是,JUnit4注释@BeforeClass没有触发失败。

结论:
JUnit4测试样式仅适用于纯Java单元测试。对于Android单元测试使用JUnit3风格,因为JUnit4是向后兼容的,它会很好地编译。
请注意,这篇文章只提到单元测试,我还没有到需要测试Android应用程序本身的阶段,功能测试。

1

一些发现:

apk的是“需要”,因为向导添加项目被测作为项目依赖(见测试项目属性)。在测试过程中,框架需要以某种方式将该项目上传到设备,因此需要安装apk。由于没有apk会出现警告信息。删除此依赖性会使警告无效。 注意,因为没有上传apk,所以没有库被上传到设备,以后在测试中给出NoClassDefFound例外。

在我的情况下,类似于原始帖子,从测试项目中移除了测试项目依赖项,并手动添加了所有需要的jar文件,这两个jar文件都是从项目测试中解决的。我并不需要额外的“测试应用程序”,这取决于项目测试中的某些其他职位是否建议。也许这是一个方便的解决方案,如果一个人有很多瓶子手动添加。

保持项目依赖关系和手动添加所需的jar都会导致解决NoClassDefFound异常中类的问题。我现在不是为什么。