Android上的图书馆项目的独立测试项目

Seb*_*ski 16 testing junit android unit-testing

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

我有我的Android (在项目设置中标记为"Library")和一个包含我的JUnit测试类的Android项目.该测试项目(在"Android"的项目设置中)正确引用了Android库.

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

+- MyLibraryProject
   +- src
      +- com/mayastudios/MyClass.java
   +- AndroidManifest.xml
   +- ...
+- MyTestProject (references MyLibraryProject)
   +- test
      +- com/mayastudios/MyClassTests.java
   +- AndroidManifest.xml
   +- ...
Run Code Online (Sandbox Code Playgroud)

这是测试项目的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>
Run Code Online (Sandbox Code Playgroud)

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

Unable to find instrumentation target package: com.mayastudios
Run Code Online (Sandbox Code Playgroud)

这是完整的控制台日志:

[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
Run Code Online (Sandbox Code Playgroud)

我试图<instrumentation>从清单中删除不起作用的标签.

我唯一的办法这个至今工作是创建一个默认的Android项目(有活动),从我的测试项目中引用它,并使用这个默认的Android项目作为包名targetPackage之下<instrumentation>.但这不是我想要的.我想要一个独立的测试项目.

有什么建议?

Seb*_*ski 25

啊,答案很简单.错误发生在第3行的测试项目的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>
Run Code Online (Sandbox Code Playgroud)

对于那些说你需要三个项目(图书馆,测试项目,测试项目)的人:他们错了.图书馆项目和测试项目就足够了.测试项目甚至不需要包含Activity.

  • 现在在ADT 22中打破了它.它在带有gradle和maven的命令行上工作,但只要库项目被标记为库,就不再在ADT上工作.如果没有,那么一切正常.但是当项目被标记为库时,您将收到一条错误消息,指出无法找到测试中的apk. (3认同)