【问题标题】:Ordeal trying to use JUnit to test a Library尝试使用 JUnit 测试库的考验
【发布时间】:2014-02-24 15:38:14
【问题描述】:

我觉得在如何使用 JUnit 测试 Android 库项目方面存在很多困惑。
我将描述到目前为止我遇到的所有错误(为了其他程序员也尝试这样做),最后我将说明我的最后一个和当前的问题。

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

  2. 对于不使用 Android API 的测试,请使用 JUnit4 样式类。如果您只遵循指南,您的测试将在运行时失败“Invalid layout of ... at value”。这是因为运行配置在其 classpath 中包含 Android。转到测试的 JUnit 测试运行配置(右键单击测试->属性->运行/调试设置->编辑)并从 classPath boostrap 条目中删除 Android。
    编辑
    首次运行测试时,在Eclipse中,如果选择Android启动器,则必须选择使用“Eclipse JUnit Launcher”或“Android JUnit Test Launcher”的启动器,无需删除引导条目。

  3. 从现在开始我没有成功。对于使用 Android API 的测试,扩展 AndroidTestCase。这些测试需要更长的时间才能启动,它们需要运行模拟器,即使您不是在测试应用程序本身,而是在测试一个没有与用户接口的实用程序类。

  4. 要运行 Android UNIT 案例测试,启动器会查找库目标项目所没有的目标包 APK 文件。

  5. 当您按照 #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 成功地测试了一个库项目并且已经解决了我的问题。

【问题讨论】:

    标签: android eclipse unit-testing junit junit4


    【解决方案1】:

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

    AndroidTestCase 需要 JUnit3 测试。注释 @Test 未通过 ClassNotFoundorg.junit.Test 类的测试。

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

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

    结论:
    JUnit4 测试风格只适用于纯 Java 单元测试。对于 Android 单元测试,使用 JUnit3 样式,因为 JUnit4 向后兼容,所以可以正常编译。
    请注意,这篇文章仅涉及单元测试,我还没有到需要通过功能测试来测试 Android 应用程序本身的阶段。

    【讨论】:

      【解决方案2】:

      一些发现:

      apk 是“需要的”,因为向导会将被测项目添加为项目依赖项(请参阅测试项目中的属性)。在测试期间,框架需要以某种方式将该项目上传到设备,因此需要一个 apk。由于没有apk,因此会出现警告消息。删除此依赖项会使警告静音。 注意,由于没有上传任何 apk 也没有将库上传到设备,因此稍后在测试中会出现 NoClassDefFound 异常。

      在我的情况下,与原始帖子类似,从 test-project 中删除 project-under-test 依赖项并从 the-project-under-test 中手动添加所有需要的 jar,包括构建和必需的 jar 解决了它。我不需要依赖于被测项目的额外“测试应用程序”,其他一些帖子建议。如果要手动添加很多罐子,也许这是一个方便的解决方案。

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

      【讨论】:

        猜你喜欢
        • 2015-10-04
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 2015-11-20
        • 1970-01-01
        相关资源
        最近更新 更多