2013-04-03 41 views
4

想要为我的应用程序编写一些测试,我偶然发现了Android testing pages。经过相当长时间的阅读后,很快就会发现,我唯一能从中获得的信息是关于如何测试UI /活动的信息。我真正想要的是只用ant test来测试我的逻辑,最好甚至不涉及该设备。在这个阶段我应该提到我没有使用Eclipse,并且令人遗憾的是,Android上99%的Java资源都假设人们这样做。单元测试Android应用程序逻辑

在任何情况下,试图让所有东西都运行,我尽可能地与教程一起玩。它要求tests目录与src的级别相同。当然,即使他们的每一页都意味着测试项目是一个完全独立的实体。在顶层项目目录中,我运行了 android create test-project -m /path/to/my/project/ -n MyProjectTest -p tests。值得一提的是,他们说他们希望事情如何成立,这与他们的说法很不一致as seen on this question。访问该目录,我发现了默认的测试文件。这是问题的起点。

我的理解是,测试的过程如下:构建应用程序,安装;去测试,建立测试,安装;使用ant test从测试目录运行测试,或者使用adb shell am instrument直接启动测试。这工作得很好。然而,我不想测试活动,只是逻辑(不访问任何视图/活动)。

更改默认的测试延长AndroidTestClass似乎有工作了一段时间。测试正在运行,但有一些警告:清洁testsant clean也清理了项目目录(../tests),所以它花了永远在一个干净的环境中建立测试(这是必要的,因为ant debug似乎可怕的检测变化),但它的工作和我很高兴。

多试验几次后,我得到java.lang.VerifyError我只测试类。谷歌搜索和堆叠周围,它归结为外部库或错误的类路径有问题。我没有使用任何外部.jar因此这可能是我的路径。

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

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

回答

2

后来一片混乱,我设法做到了。

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

想象一下,我的软件包叫做com.foo.bar。我在src/com/foo/bar/tests中创建了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%,希望对将来像我这样的人有所帮助。

编辑: 有可能加入上次导入下面按照build.xml只是影子原ant test行为:

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