【问题标题】:Unit testing Android application logic单元测试 Android 应用程序逻辑
【发布时间】:2013-04-03 01:06:25
【问题描述】:

想为我的应用程序编写一些测试,我偶然发现了Android testing pages。经过相当长的阅读后,我很快就发现我唯一能从中得到的就是关于如何测试 UI/Activity 的信息。我真正想要的是用简单的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 从测试目录运行测试或使用adb shell am instrument 直接启动它们。这工作得很好。然而,我不想测试活动,而只是测试逻辑(不访问任何视图/活动)。

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

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

无论如何,这是我的问题: 什么是使用 JUnit 在 Android 应用程序中对逻辑进行单元测试的正确方式™?我根本找不到任何与此相关的资源:所有资源要么用于测试 UI 部分,要么用于对普通应用程序进行单元测试。

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

【问题讨论】:

    标签: android unit-testing junit


    【解决方案1】:

    后来搞了很长时间,我设法做到了。

    首先,我忽略了使用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" />
    

    已添加到您的 &lt;application&gt; 部分。

    我不知道需要更改哪些内容才能在本地测试而不是在设备上测试,但这是 75% 的答案,希望将来对像我这样的人有所帮助。

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

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

    【讨论】:

      【解决方案2】:

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

      Square 关于该主题的一篇好文章:The Resurrection of Testing for Android

      【讨论】:

        猜你喜欢
        • 2011-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-30
        • 2012-02-05
        • 1970-01-01
        相关资源
        最近更新 更多