【问题标题】:Running unit tests with ant on an eclipse project在 Eclipse 项目中使用 ant 运行单元测试
【发布时间】:2012-10-15 23:29:59
【问题描述】:

好的,所以我现在花了整整 3 天时间梳理网络,试图弄清楚如何在我的 eclipse 项目的命令行中使用 ant 运行一些单元测试。

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

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

我似乎找不到任何不是在 2010 年编写的指南,但我仍然尝试遵循它们,我已经安装了 ant 并在我的项目中创建了一个 build.xml 文件,我复制-pasta从导游那里得到的。因为我只能猜测构建文件中发生了什么(以前从未使用过 ant),所以当问题出现时,我几乎是 SOL。

目前,当我尝试运行它时,它说“包 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

谢谢

【问题讨论】:

    标签: android eclipse unit-testing ant


    【解决方案1】:

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

    Ant 使用&lt;junit&gt; 任务来执行您的 JUnit 测试。您必须确保在 &lt;junit&gt; 类路径中有 JUnit jar。

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

    • 编译您的单元测试。
    • 运行&lt;junit&gt; 来执行您的测试。 formatter 将指定您希望如何格式化测试。您可以创建一个 XML 输出,然后对其运行 XSLT 转换。

    当您运行 &lt;junit&gt; 测试时,您使用 &lt;test&gt;&lt;batchtest&gt; 子任务到 &lt;junit&gt; 任务来实际运行测试,然后使用 &lt;formatter&gt; 格式化您的测试以获得可读输出.

    我不是在构建 Android 应用,但这是我的 Junit 测试示例:

    <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}"/>
    

    <!-- Execute all classfiles you've compiled in test-classes directory -->
    <junit fork="true"
        maxmemory="128m"
        includeAntRuntime="true">
        <classpath>
            <pathelement path="${main.destdir}"/>
            <pathelement path="${test.destdir}"/>
        </classpath>
        <classpath refid="test.classpath"/>
        <formatter type="plain"/>
        <batchtest
            todir="${junit.batchtest.todir}">
            <fileset dir="${test.destdir}"/>
        </batchtest>
    </junit>
    

    【讨论】:

    • 嗯,好的,谢谢你的信息。我不知道这是一个两步过程。我想我正在将 JUnit 添加到类路径中;我的看起来对吗?
    • 你需要&lt;javac&gt; 来编译你的单元测试。包括用于编译代码的第一个&lt;javac&gt; 放置类文件ANT JUnit jar 的目录。然后,您可以通过&lt;test&gt; 子任务选择要运行的测试(如果您有一个运行单元测试的程序,或者使用&lt;batchtest&gt; 来运行由您的&lt;javac&gt; 任务编译的所有单元测试. 我将更新我的答案以包括初始编译
    【解决方案2】:

    感谢您的帮助大卫。实际上,我决定放弃尝试使用 ant,因为我真正想做的就是通过命令行运行单元测试,这可以使用 adb shell 中的am instrument 命令来完成(我通过查看 android dev 文档发现阿金)。

    所以,我不确定我在这里做的是否正确,因为虽然我找到了我真正想要的答案,但这并不是我提出的问题的答案,即如何运行通过命令行通过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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2011-06-13
      • 2013-05-29
      • 2012-01-25
      • 1970-01-01
      • 2013-07-31
      • 2020-02-21
      相关资源
      最近更新 更多