【问题标题】:Stand-alone test project for a library project on AndroidAndroid 上一个库项目的独立测试项目
【发布时间】:2012-05-05 07:22:07
【问题描述】:

我的问题是:如何为 Android 库创建一个 Android 独立测试项目?

我有我的 Android (在项目设置中标记为“库”)和一个包含我的 JUnit 测试类的 Android 项目。 test 项目正确引用了 Android 库(在“Android”下的项目设置中)。

我的源代码位于包com.mayastudios。我所有的测试用例也位于同一个包中(但在不同的项目中)。所以基本上我有这样的东西:

+- MyLibraryProject
   +- src
      +- com/mayastudios/MyClass.java
   +- AndroidManifest.xml
   +- ...
+- MyTestProject (references MyLibraryProject)
   +- test
      +- com/mayastudios/MyClassTests.java
   +- AndroidManifest.xml
   +- ...

这是 test 项目的 Android 清单:

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

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

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.mayastudios" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application android:label="Spatialite-NewApi-UnitTests">
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>

但是,当我运行 test 项目(从带有 ADT 的 Eclipse,使用“Run As -> Android JUnit Test”)时,我收到以下错误:

Unable to find instrumentation target package: com.mayastudios

这是完整的控制台日志:

[2012-04-24 17:24:20 - spatialite-test] Android Launch!
[2012-04-24 17:24:20 - spatialite-test] adb is running normally.
[2012-04-24 17:24:20 - spatialite-test] Performing android.test.InstrumentationTestRunner JUnit launch
[2012-04-24 17:24:20 - spatialite-test] Automatic Target Mode: using device '3732FBC2711300EC'
[2012-04-24 17:24:20 - spatialite-test] Uploading spatialite-test.apk onto device '3732FBC2711300EC'
[2012-04-24 17:24:20 - spatialite-test] Installing spatialite-test.apk...
[2012-04-24 17:24:22 - spatialite-test] Success!
[2012-04-24 17:24:22 - spatialite-test] Launching instrumentation android.test.InstrumentationTestRunner on device 3732FBC2711300EC
[2012-04-24 17:24:22 - spatialite-test] Collecting test information
[2012-04-24 17:24:23 - spatialite-test] Test run failed: Unable to find instrumentation target package: com.mayastudios

我试图从清单中删除 &lt;instrumentation&gt; 标记,但不起作用。

到目前为止,我完成这项工作的唯一方法是创建一个默认 Android 项目(带有一个 Activity),从我的测试项目中引用它,并在 &lt;instrumentation&gt; 下使用这个默认 Android 项目的包名称为 targetPackage。但这不是我想要的。我想要一个独立的测试项目。

有什么建议吗?

【问题讨论】:

  • InstrumentationTestRunner 必须针对具体的 apk,而库项目本身不允许导出为 apk。我已经在here 详细解释了这一点。
  • 是的,我明白了。我只是认为 test.apk 可以自行运行,因为它已安装在设备上。
  • 它确实像我预期的那样工作。请参阅下面的答案。

标签: android unit-testing testing junit


【解决方案1】:

啊,答案很简单。错误出现在第 3 行 test 项目的 Android 清单中:这里提到了错误的包。所以更正后的清单如下所示:

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

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

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.mayastudios" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application android:label="Spatialite-NewApi-UnitTests">
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>

对于所有说您需要三个项目(库、被测项目、测试项目)的人:他们错了。一个库项目和一个测试项目就足够了。测试项目甚至不需要包含 Activity。

【讨论】:

  • 我想com.mayastudios 是你的测试项目。测试项目可以针对自身,查看我的答案here。您实际上所做的只是使 test.apk 可运行并以自身为目标(您不是您的库代码的目标)。官方开发指南中已经明确说明需要一个Application Project来间接测试Library项目。
  • @yorkw:实际上,假设 com.mayastudios 链接到要测试的 Android 库项目,这种模式适合 the second bullet of the page you linked to in your comment on my now-deleted answer
  • @CommonsWare,啊啊啊,我现在明白了。塞巴斯蒂安,是的,你是对的。我自己从来没有使用过这种模式,值得了解。
  • 很高兴,我可以提供一些新见解 :)
  • 这现在在 ADT 22 中被破坏了。它可以在 gradle 和 maven 的命令行上工作,但只要库项目被标记为库,它就不再在 ADT 上工作。如果没有,那么一切正常。但是当项目被标记为库时,你会收到一条错误消息,说找不到被测的apk。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2011-03-23
相关资源
最近更新 更多