2010-08-30 57 views
80

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

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

+1

或(**无耻插件警报**)你可以使用我创建的项目:Android库测试线束(我喜欢称之为“Alt H”)。它可以作为一个git回购:https://gitorious.org/alth该项目仍在开发中,文档有点稀疏,所以如果您有任何问题,请随时打我。 – i41 2013-09-27 15:42:32

回答

60

报价the documentation

“有一个库项目建立的代码和资源测试的两种推荐方式:

  • 可以设置一个测试项目,仪器的应用项目取决于库项目,然后可以将项目的测试添加到项目中以获得特定于库的功能

  • 您可以设置一个标准应用程序项目,该项目依赖于库并将其放入在该项目中进行整顿。这使您可以创建包含测试/仪器及代码来测试一个自包含的项目。”

+19

所以基本上你所要做的就是将库添加到你的测试项目并测试测试项目。 – njzk2 2011-08-23 14:01:56

+0

该链接不再有效,您有什么机会可以将我们指向当前的链接? – 2011-11-30 19:04:24

+0

看起来像:http://developer.android.com/guide/developing/projects/index.html#testing – 2011-11-30 19:06:28

0

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

+0

我取决于Android位图类... – Lily 2010-08-30 20:48:56

+1

这不起作用,因为标准JUnit编译为标准JVM,而Android Java文件编译为Dalvik VM。 – 2013-05-14 22:40:26

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标签。

然后运行你的测试。

+0

您的想法对我有意义,因此测试的目标是自己(作为应用程序),应用程序与库链接....但我无法通过ant build或IntelliJ将它运行...当它试图安装它时,.apk(预计用于被测试的应用程序)不存在,因为它正在被编译为“test/bin /.- debug.apk” – 2013-11-24 16:55:37

+0

我通过更改软件包清单中的测试项目的名称(以及被测试的包 - 应该是相同的)与库项目的包名称不一致,以及在ant.properties文件中删除对目标测试项目的引用。 – 2013-11-24 17:44:25

+1

我认为这是比接受的更好的答案,只是回声的文档 - 恕我直言。 – 2013-11-24 17:49:01

0

注意:此解决方案基于使用Eclipse Indigo(3.8.2),可能必须稍微不同于另一个IDE,但基本原则将相同。

我有类似的问题,我发现,请执行下列操作总是工作:

注:这些指令是从头开始建立一个新的项目组如果你已经建立了项目组的部分,那么你可能有让他们以同样的方式连接到修改的项目。

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

您应该结束了三个项目(Android的图书​​馆,Android的测试应用程序,Android的图书​​馆计)看上去类似这样:

enter image description here

enter image description here

enter image description here

你最终应该有一个类来测试你的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

1

documentation

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

+0

哪个任务运行测试? gradle测试,还是gradle androidTest? androidTest不是一项任务。 – Sunnyday 2018-02-23 00:00:58