在eclipse项目上使用ant运行单元测试

时间:2012-10-15 23:30:00

标签: android eclipse unit-testing ant

好吧,所以我花了3天时间梳理网络,试图找出如何使用命令行中的ant运行一些单元测试来进行我的eclipse项目。

我可以通过“Run As”在Eclipse中运行测试 - > “Android JUnit测试”

我现在想要的是能够通过命令行运行测试。就是这样。

我似乎找不到任何关于2010年没有编写的指南,但是试图遵循它们但是我已经安装了ant并在我的项目中创建了一个build.xml文件,我复制了面食来自导游。因为我只能猜测构建文件中发生了什么(以前从未使用过ant),当问题出现时,我的头脑很难看,我就是SOL。

目前,当我尝试运行它时,它说“package android.app不存在”(我正在使用Activity类),对于我已经包含在项目的“/ libs”中的库jar文件也一样“文件夹。

似乎很清楚,在某个地方我错过了一些路径声明,但我尝试的任何东西似乎都没有用。

编辑(添加代码): 这是MockTester.java -

package com.android.mocksdktester;

import static org.junit.Assert.*;
import android.app.Activity;    
import android.test.AndroidTestCase;

import com.mock.android.lib.*;

public class MockTester extends AndroidTestCase
{
    Activity mActivity;
    MockFeature mFeature;

    public MockTester()
    {   
    }


    public void testExists()
    {
        String test = null;
        assertNull(test);
    }
}

正如你所看到的,不是很多。 这是我得到的build.xml文件,正如我所提到的,我只能猜测它正在做什么。

<?xml version="1.0"?>
<!-- to save as "build.xml" -->
<project name="Mock Unit Tests" default="run" basedir=".">
    <path id="junit_classpath"> 
        <pathelement location="C:\eclipse\plugins\org.junit_4.8.2.v4_8_2_v20110321-1705\junit.jar"/>
    </path>

    <!-- Library Project Here -->
    <fileset dir="libs" includes="*.jar"/>


    <!-- build all classes in this directory -->
    <!-- To run this: use "ant build" -->
    <!-- need to include junit.jar in the classpath -->
    <target name="build">   
        <javac srcdir="${basedir}"/>
        <echo message="Build done" />
    </target>

    <!-- Test and build all files  -->
    <!-- To run this: use "ant" (default) or "ant run" -->
    <target name="run" depends="build">
        <java taskname="Test" classname="MockTester" fork="true" failonerror="true" />
        <echo message="Unit Tests done" />
    </target>

    <!-- delete all class files -->
    <!-- To run this: use "ant clean" -->
    <target name="clean">
        <delete>
            <fileset dir="${basedir}" includes="*.class" />
        </delete>
        <echo message="clean done" />
    </target>

</project>

有人抱怨过去没有看过junit,但我设法解决了这个问题。我只是不确定当它缺少与Android相关的类以及项目中包含的jar文件时该怎么做(虽然我读过这是一个错误)。

错误:

build:
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\build.xml:16: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 3 source files
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:14:error: package android.app does not exist
[javac] import android.app.Activity;
[javac]                   ^
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:15:error: package android.test does not exist
[javac] import android.test.AndroidTestCase;
[javac]                    ^
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:18:error: package com.mock.android.lib does not exist
[javac] import com.mock.android.lib.*;
[javac] ^
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:20:error: cannot find symbol
[javac] public class MockTester extends AndroidTestCase
[javac]                                  ^
[javac]   symbol: class AndroidTestCase
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:22:error: cannot find symbol
[javac]     Activity mActivity;
[javac]     ^
[javac]   symbol:   class Activity
[javac]   location: class MockTester
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:23:error: cannot find symbol
[javac]     MockFeature mFeature;
[javac]     ^
[javac]   symbol:   class MockFeature
[javac]   location: class MockTester
[javac] 6 errors

BUILD FAILED

由于

2 个答案:

答案 0 :(得分:0)

没有解释你做了什么或失败了什么?你的项目是如何组织的?

Ant使用<junit>任务来执行JUnit测试。您必须确保在<junit>类路径中有JUnit jar。

通常情况下,这是一个两步过程:

  • 编译单元测试。
  • 运行<junit>以执行测试。 formatter将指定您希望如何格式化测试。您可以创建XML输出,然后对其运行XSLT转换。

运行<junit>测试时,使用<test><batchtest>子任务执行<junit>任务以实际运行测试,然后使用{{ 1}}为可读输出格式化测试。

我没有构建Android应用,但这是我的Junit测试样本:

<formatter>

<property name="target.dir"   value="${basedir}/target"/>
<property name="main.destdir" value="${target.dir}/classes"/>
<property name="test.srcdir"  value="${basedir}/src/test/java"/>
<property name="test.destdir" value="${target.dir}/test-classes"/>

<!-- Path for all jars required for compiling your actual source -->
<path id="main.classpath">
     <fileset dir="${basedir}/lib"/>
<path>

<!-- Includes JUnit.jar and the main.classpath jars too -->
<path id="test.classpath">
     <fileset dir="${basedir}/test-lib"/>
     <fileset dir="${basedir}/lib"/>
</path>
<mkdir dir="${test.destdir}"/>

<!-- Compile tests -->
<javac destdir="${test.destdir}"
    fork="false"/>
    <src path="${test.srcdir}"/>
    <classpath refid="test.classpath"/>
    <classpath refid="${main.destdir}"/>

答案 1 :(得分:0)

感谢大卫的帮助。我实际上决定放弃尝试使用ant,因为我真的想通过命令行运行单元测试,这可以使用adb shell中的am instrument命令完成(我通过浏览器找到了dev docs agian)。

所以,我不确定我在这里做的是正确的,因为虽然我找到了我真正想要的答案,但这不是我问的问题的答案,这就是如何运行通过命令行通过ant 进行测试。

我的特定命令如下所示:adb shell am instrument -w com.android.mocksdktester.test/andro id.test.InstrumentationTestRunner

在我开始工作之前,我有几个陷阱。

  1. 您需要确保在测试工作之前,您正在测试测试应用程序安装的应用程序。

  2. 我从命令行创建了http://developer.android.com/tools/testing/testing_otheride.html之后的测试项目,然后将项目导入到eclipse中。我看到包名称与我试图测试的应用程序包相同,我认为这是错误的所以我将其更改为其他内容,并且它已经破坏了。所以,不要那样做:P(除非你知道如何更改它而不是破坏它)。

  3. 我试图运行adb shell am instrument -w com.android.mocksdktester/andro id.test.InstrumentationTestRunner的时间最长。我在包名的末尾没有.test,而且据我所知,没有迹象表明我需要它。文档说"The Android package name of the test package."com.android.mocksdktester。我想到将.test添加到其末尾的唯一原因是因为我从一个不同的问题中找到了命令adb shell pm list instrumentation,我认为它列出了当前在您的模拟器/设备上的所有检测包,列表中的一个项目是

      

    instrumentation:com.android.mocksdktester.test / android.test.InstrumentationTestRunner(target = com.android.mocksdktester)。