单元测试Android应用程序逻辑

时间:2013-04-03 01:06:26

标签: android unit-testing junit

为了为我的应用程序编写一些测试,我偶然发现了Android testing pages。经过相当长的阅读后,我很快就发现,我唯一可能得到的就是如何测试UI /活动的信息。我真正想要的是用简单的ant test测试我的逻辑的方法,最好不要涉及设备。我应该在这个阶段提到我没有使用Eclipse,而且令人非常难过的是,Android上99%的Java资源都假设人们这样做。

在任何情况下,尝试运行任何东西,我尽可能多地使用教程。它要求tests目录与src处于同一级别。当然,即使他们的每一页都暗示测试项目是一个完全独立的实体。在顶级项目目录中,我跑了 android create test-project -m /path/to/my/project/ -n MyProjectTest -p tests。值得一提的是,他们非常不同意他们希望如何设置事物as seen on this question。访问该目录,我发现了默认的测试文件。问题就在这里。

据我了解,测试完成如下:构建应用程序,安装;去测试,构建测试,安装;使用ant test从tests目录运行测试,或使用adb shell am instrument直接启动它们。这很好。但是我不想测试活动,只想测试逻辑(不访问任何视图/活动)。

将默认测试更改为扩展AndroidTestClass似乎已经有一段时间了。测试正在运行,但有一些警告:用tests清理ant clean也清理了项目目录(../tests),因此需要永远在干净的环境中构建测试(这是必要的,因为ant debug在检测到变化时似乎很糟糕但是它很有用,我很高兴。

以后几次测试,我在我唯一的测试课上得到java.lang.VerifyError。谷歌搜索和堆叠,它归结为外部库的错误或类路径错误。我没有使用任何外部.jar,所以这可能是我的道路。

无论如何,这是我的问题: 使用JUnit在Android应用程序中单元测试逻辑的Proper Way™是什么?我根本无法找到任何资源:所有资源都用于测试UI部件或用于测试普通应用程序。

我如何单独测试我的逻辑 ?这甚至不需要设备运行,因为我不需要使用Android的任何部分。我在哪里进行测试?我需要更改什么才能在项目目录中运行ant test然后运行那些?

2 个答案:

答案 0 :(得分:2)

后来长时间乱七八糟,我成功了。

首先,我忽略了使用adb创建任何项目。

想象一下,我的包被称为com.foo.bar。我在tests中创建了src/com/foo/bar/tests。在那里,编写常规的JUnit测试。确保将package com.foo.bar.tests放入测试类中。这是一个示例类:

package com.foo.bar.tests;

import com.foo.bar.baz.Foo;

import org.junit.*;
import junit.framework.*;
import static org.junit.Assert.*;


public class MyTests extends TestCase {

    public void testSomething() {
        Foo testFoo= new Foo();
        assertEqual(testFoo.getBar(), 1);
    }
}

接下来是使用ant test运行测试的情况。要实现此目的,请在最后一个结束括号(AndroidManifest.xml)之前的</manifest>添加以下内容:

<instrumentation android:name="android.test.InstrumentationTestRunner"
                 android:targetPackage="com.foo.bar"
                 android:label="Tests for com.foo.bar"/>

您还需要

<uses-library android:name="android.test.runner" />

已添加到您的<application>部分。

我无法弄清楚需要改变什么才能在本地进行测试,而不是在设备上进行测试,但这是75%的答案,希望将来对我这样的人有所帮助。

编辑: 通过在ant test中的最后一次导入下添加以下内容,可以隐藏原始build.xml行为:

   <target name="test" >
       <junit>
           <!-- all your junit stuff here -->
       </junit>
   </target>

答案 1 :(得分:1)

查看Robolectric - 它可以让您避免Google在测试解决方案中的噩梦。

Square上关于这个问题的一篇好文章:The Resurrection of Testing for Android