如何测试Android库项目


97

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

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


1
或者(无耻的插件警告),您可以使用我创建的项目:Android库测试工具(我想称之为“ Alt H”)。它可以作为git repo来使用:gitorious.org/alth该项目仍在开发中,文档有点稀疏,所以如果您有任何疑问,请随时联系我。
i41 2013年

Answers:


75

引用文档

“有两种建议的方法可以对库项目中的代码和资源进行测试:

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

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


27
因此,基本上您要做的就是将库添加到测试项目中并测试该测试项目。
njzk2 2011年

该链接不再有效,您是否有机会将我们指向当前链接?
阿卜杜拉·吉巴利


4
不知道是否有人在这些建议上取得了成功,但我没有。首先尝试了第二个解决方案,当我尝试在Eclipse中运行时,得到以下信息:<ProjectName>未指定android.test.InstrumentationTestRunner工具,或者未在其AndroidManifest.xml中声明uses-library android.test.runner。尽管事实是我在Manifest中添加了Instrumentation和use-library元素。
Bellinghammer

2
得到了第二个(也是首选的工作方式)。在清单中的正确位置获取uses-library和Instrumentation元素非常重要。Instrumentation元素是根清单元素的子元素,而uses-library元素是application元素的子元素。我将uses-library放在manifest元素下,并在尝试运行测试时出现上面的错误消息。
Bellinghammer

17

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

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

然后运行测试。


您的想法对我来说很有意义,因此测试以其自身(作为应用程序)为目标,并且该应用程序与库链接了....但是我无法通过ant build或IntelliJ ...使其工作。 .apk(预期在测试中的应用程序)在尝试安装时不存在,因为它正在编译为“ test / bin /.- debug.apk”
Andrew Mackenzie

我通过更改清单中测试项目的软件包名称(和被测试的软件包-应该相同)来使其与库项目的软件包名称不一致,然后删除了对目标测试的引用,从而使其起作用ant.properties文件中的项目。
Andrew Mackenzie

1
我认为这是一个比公认的更好的答案,它只是在回响文档-IMHO。
Andrew Mackenzie 2013年


5

根据文档

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


哪个任务要运行测试?gradle测试,还是gradle androidTest?androidTest不是任务。
Sunnyday

但是诸如Firebase Test Lab之类的工具需要APK或AAB,并且不接受AAR文件,该文件是库的汇编任务的输出
Mustafa Berkay Mutlu

1

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

我遇到了类似的问题,发现执行以下操作始终有效:

注意:这些说明是用于从头开始构建新的项目组。如果已经构建了项目组的各个部分,则可能必须修改您的项目,以便它们以相同的方式连接。

  1. 通过在创建过程中选中“是库”复选框来创建新的Android库项目。(例如,一个名为“ RemingtonAndroidTools”的Android项目)。
  2. 生成Android Library项目,并验证其是否在bin文件夹中创建了jar文件。(例如,一个名为“ RemingtonAndroidTools.jar”的jar文件。)
  3. 创建一个空的Android项目以测试将用作Android测试应用程序的Android应用程序。(例如,一个名为“ RemingtonAndroidToolsTestApp”的Android项目)。除非您必须添加某些内容以进行测试,否则您无需修改​​Android Test App项目的源代码或资源。无需对Android Test App Project进行任何修改就可以测试很多东西。 Android Test App项目是您的Android Library项目和Android Junit项目之间的桥梁,这使得可以通过Android Junit测试Android Library项目。
  4. 转到Android测试应用程序项目(此示例中为“ RemingtonAndroidToolsTestApp”)的Java构建路径的“库”选项卡。
  5. 通过“添加罐子...”按钮添加Android库项目(在此示例中为“ RemingtonAndroidTools”)的jar文件(在此示例中为“ RemingtonAndroidTools.jar”)。
  6. 创建一个新的Android Test项目(例如“ RemingtonAndroidToolsTester”)作为Android库测试器,然后选择Android Test App项目(在本示例中为“ RemingtonAndroidToolsTestApp”)作为目标。
  7. 转到Android Library Tester项目的Java Build Path的Library选项卡(在此示例中为“ RemingtonAndroidToolsTester”)。
  8. 通过“添加罐子...”按钮添加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 Test App的类(例如,“ TestActivity.class”)。

您应该最终看到三个类似于以下的项目(Android库,Android测试应用程序,Android库测试程序):

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

您应该以一个类似于以下内容的类来测试您的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特定组件(例如Assets文件夹),否则您无需进一步引用Android Test App(在此示例中为“ RemingtonAndroidToolsTestApp”)即可运行测试。如果您需要访问任何特定于Android的组件,则可以通过修改Android测试应用程序(此示例中为“ RemingtonAndroidToolsTestApp”),然后通过标准Android Junit API提供的工具进行引用来进行访问。(您可以在此处阅读有关此内容的更多信息:http : //developer.android.com/tools/testing/testing_android.html


0

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


2
这是行不通的,因为标准的JUnit可以编译为标准的JVM,而Android的Java文件则可以编译为Dalvik VM。
Danny Remington-OMS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.