为了为我的应用程序编写一些测试,我偶然发现了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
然后运行那些?
答案 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。