【问题标题】:How to test an Android Library Project如何测试一个 Android 库项目
【发布时间】:2010-08-30 19:42:36
【问题描述】:

我正在编写一个基于 Android Bitmap 类(称为 AndroindLib)的 Android 库项目,它仅包含实用程序类(无活动)。我尝试使用 Android JUnit 对其进行测试,但它一直抱怨找不到 AnroidLib.apk

单元测试 Android 库项目的正确方法是什么?

【问题讨论】:

  • 或者(shameless plug alert)你可以使用我创建的一个项目:Android Library Test Harness(我喜欢称之为“Alt H”)。它可以作为 git repo 获得:gitorious.org/alth 该项目仍在开发中,文档有点稀疏,如果您有任何问题,请随时联系我。

标签: android junit apk


【解决方案1】:

引用the documentation:

“有两种推荐的方法来设置库项目中的代码和资源测试:

  • 您可以设置一个测试项目来检测依赖于库项目的应用程序项目。然后,您可以将测试添加到项目中以获得特定于库的功能。

  • 您可以设置一个依赖于库的标准应用程序项目,并将检测工具放入该项目中。这使您可以创建一个独立的项目,其中包含测试/仪器和要测试的代码。”

【讨论】:

  • Archive of blog post: android-library-project-with-tests-step-by-step 帮助描述了在 CommonsWare 的回答中实施第二个建议所需的过程
  • 所以基本上您所要做的就是将库添加到您的测试项目并测试测试项目。
  • 该链接已失效,您能否将我们指向当前的链接?
  • 不确定是否有其他人在这些建议方面取得了成功,但我没有。首先尝试了第二个解决方案,当我尝试在 Eclipse 中运行时,我得到以下信息: 未指定 android.test.InstrumentationTestRunner 工具或未在其 AndroidManifest.xml 中声明使用库 android.test.runner。尽管我在我的清单中添加了检测和使用库元素。
  • 获得了第二种(也是首选的工作方式)。将 uses-library 和 Instrumentation 元素放在清单中的正确位置非常重要。 Instrumentation 元素是根 manifest 元素的子元素,而 uses-library 元素是 application 元素的子元素。我将使用库放在清单元素下,并在尝试运行测试时出现上面的错误消息。
【解决方案2】:

在您的测试项目中,只需更改包名称,使其与您的库的包相同。 例如,您有一个库,其包为"com.example.lib"。创建一个针对您的库的测试项目。在清单文件中,您将看到package="com.example.lib.test" 和targetPackage="com.example.lib"。只需将包从“com.example.lib.test”更改为“com.example.lib”(targetPackage 保持原样)。

此外,请确保该库在 Java 构建路径中被引用到您的测试项目 NOT,但作为通常的 Android 库:在 Eclipse 中,它必须在 Project->Properties->Android 选项卡中显示为库,但不是在Project->Properties->Java Build Path标签中。

然后运行你的测试。

【讨论】:

  • 您的想法对我来说很有意义,因此测试以自身为目标(作为应用程序)并且应用程序与库链接....但我无法通过 ant build 让它工作也不是 IntelliJ....因为 .apk(预期用于被测应用)在尝试安装时不存在,因为它正在编译为“test/bin/.-debug.apk”
  • 我只是通过更改清单中的测试项目的包名(以及被测包 - 应该相同)来使其与库项目的包名不一致,从而使其工作,加上在 ant.properties 文件中删除对目标测试项目的引用。
  • 我认为这是一个比公认的更好的答案,它只是与文档相呼应 - 恕我直言。
【解决方案3】:

根据documentation:

测试库模块与测试应用程序相同。 主要区别在于库及其依赖项会自动包含为测试 APK 的依赖项。这意味着测试 APK 不仅包括它自己的代码,还包括库的 AAR 及其所有依赖项。因为没有单独的“正在测试的应用程序”,所以 androidTest 任务仅安装(和卸载)测试 APK。 合并多个清单文件时,Gradle 遵循默认优先级顺序,将库的清单合并到测试 APK 的主清单中。

【讨论】:

  • 运行测试哪个任务? gradle 测试,还是 gradle androidTest? androidTest 不是任务。
  • 但是像 Firebase 测试实验室这样的工具需要 APK 或 AAB,并且不接受作为库的 assemble 任务输出的 AAR 文件
【解决方案4】:

注意:此解决方案基于使用 Eclipse Indigo (3.8.2),尽管基本原理相同,但对于另一个 IDE 的实现可能略有不同。

我有类似的问题,我发现执行以下操作总是有效的:

(注意:这些说明用于从头开始构建新的项目组。如果您已经构建了项目组的一部分,那么您可能需要修改您的项目,以便它们以相同的方式连接方式。)

  1. 通过在创建过程中选中“Is Library”复选框来创建一个新的 Android Library 项目。 (例如名为“RemingtonAndroidTools”的 Android 项目)。
  2. 构建 Android 库项目并验证它是否在 bin 文件夹中创建了一个 jar 文件。 (例如名为“RemingtonAndroidTools.jar”的 jar 文件。)
  3. 创建一个空的 Android 项目来测试将用作 Android 测试应用程序的 Android 应用程序。 (例如一个名为“RemingtonAndroidToolsTestApp”的 Android 项目)。您无需修改​​ Android Test App 项目的源代码或资源,除非您有一些必须添加以进行测试的内容。许多东西都可以在不修改 Android 测试应用项目的情况下进行测试。 Android Test App 项目是您的 Android Library 项目和 Android Junit 项目之间的桥梁,它使通过 Android Junit 测试 Android Library 项目成为可能。
  4. 转到 Android 测试应用项目(本例中为“RemingtonAndroidToolsTestApp”)的 Java 构建路径的库选项卡。
  5. 通过“Add Jars...”按钮添加 Android 库项目(本例中为“RemingtonAndroidTools”)的 jar 文件(本例中为“RemingtonAndroidTools.jar”)。
  6. 创建一个新的 Android 测试项目(例如“RemingtonAndroidToolsTester”)作为 Android 库测试器,并选择 Android 测试应用项目(本例中的“RemingtonAndroidToolsTestApp”)作为目标。
  7. 转到 Android Library Tester 项目(本例中为“RemingtonAndroidToolsTester”)的 Java Build Path 的 Library 选项卡。
  8. 通过“Add Jars...”按钮添加 Android 库项目(本例中为“RemingtonAndroidTools”)的 jar 文件(本例中为“RemingtonAndroidTools.jar”)。
  9. 在 Android Library Tester 项目中找到您的 Android 包的最后一个文件夹(例如“danny.remington.remington_android_tools_test_app.test”)并添加一个继承自 ActivityInstrumentationTestCase2 的测试类(例如“MainActivityTest”)。
  10. 编辑测试类(本例中为“TestActivityTest”)以使用 Android 测试应用(本例中为“RemingtonAndroidToolsTestApp”)的活动(例如“TestActivity”)作为 ActivityInstrumentationTestCase2 的参数。
  11. 编辑测试类(本例中为“TestActivityTest”)并创建一个默认构造函数,该构造函数调用 super(Class) 并传入 Android 测试应用程序的类(例如“TestActivity.class”)。

您最终应该得到三个看起来与此类似的项目(Android Library、Android Test App、Android Library Tester):

您应该最终得到一个类似于以下内容的用于测试您的 Android 库的类:

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

然后您可以添加任何您想要的测试。您无需进一步引用 Android 测试应用程序(本例中为“RemingtonAndroidToolsTestApp”)来运行您的测试,除非它们需要访问 Android 特定组件(例如 Assets 文件夹)。如果您需要访问任何 Android 特定组件,您可以通过修改 Android 测试应用程序(本例中为“RemingtonAndroidToolsTestApp”)然后通过标准 Android Junit API 提供的工具引用它来实现。 (您可以在此处阅读更多相关信息:http://developer.android.com/tools/testing/testing_android.html)

【讨论】:

    【解决方案5】:

    如果你的 ulitiy 类不依赖于任何 android 特定的代码,你可以只使用标准的 JUnit 单元测试。无需使用安卓版本。

    【讨论】:

    • 这不起作用,因为标准 JUnit 被编译到标准 JVM,而 Android java 文件被编译到 Dalvik VM。
    猜你喜欢
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多