2011-09-25 87 views
1

我现在在学习如何使用ant来运行自动化测试,如下所示:tutorial在Eclipse中运行Ant的JUnit测试问题。初学者问题

我在我的项目的类路径中有JUnit。一切似乎很好地工作,我可以包括它在我的课:

import junit.framework.TestCase; //line20 

public class SimpleLattice1DTest extends TestCase{ 
... 
} 

我的build.xml文件是:

<?xml version="1.0"?> 
<project name="Ant-Test" default="compile" basedir="."> 
    <!-- Sets variables which can later be used. --> 
    <!-- The value of a property is accessed via ${} --> 
    <property name="src.dir" location="." /> 
    <property name="build.dir" location="build" /> 
    <property name="dist.dir" location="dist" /> 
    <property name="docs.dir" location="docs" /> 
    <property name="test.dir" location="jlife/tests" /> 
    <property name="test.report.dir" location="test/report" /> 

    <!-- Deletes the existing build, docs and dist directory--> 
    <target name="clean"> 
     <delete dir="${build.dir}" /> 
     <delete dir="${docs.dir}" /> 
     <delete dir="${dist.dir}" /> 
    </target> 

    <!-- Creates the build, docs and dist directory--> 
    <target name="makedir"> 
     <mkdir dir="${build.dir}" /> 
     <mkdir dir="${docs.dir}" /> 
     <mkdir dir="${dist.dir}" /> 

     <mkdir dir="${test.report.dir}" /> 


    </target> 

    <!-- Compiles the java code (including the usage of library for JUnit --> 
    <target name="compile" depends="clean, makedir"> 
     <javac srcdir="${src.dir}" destdir="${build.dir}"> 
     </javac> 

    </target> 

    <!-- Creates Javadoc --> 
    <target name="docs" depends="compile"> 
     <javadoc packagenames="src" sourcepath="${src.dir}" destdir="${docs.dir}"> 
      <!-- Define which files/directory should get included, we include all --> 
      <fileset dir="${src.dir}"> 
       <include name="**" /> 
      </fileset> 
     </javadoc> 
    </target> 

    <!--Creates the deployable jar file --> 
    <target name="jar" depends="compile"> 
     <jar destfile="${dist.dir}\CoreTest.jar" basedir="${build.dir}"> 
      <manifest> 
       <attribute name="Main-Test" value="test.CoreTest" /> 
      </manifest> 
     </jar> 
    </target> 


    <!-- Run the JUnit Tests --> 
     <!-- Output is XML, could also be plain--> 
     <target name="junit" depends="compile"> 
      <junit printsummary="on" fork="true" haltonfailure="yes"> 

       <formatter type="xml" /> 
       <batchtest todir="${test.report.dir}"> 
        <fileset dir="${src.dir}"> 
         <include name="**/*Test*.java" /> 
        </fileset> 
       </batchtest> 
      </junit> 
     </target> 

</project> 

当我运行到Eclipse中,我得到以下错误:

[javac] C:\Documents and Settings\noname\Documenti\JLife_git\JLife_git\JLife\src\jlife\tests\SimpleLattice1DTest.java:20: package junit.framework does not exist [javac] import junit.framework.TestCase;

我想它有什么问题,但我不知道。有人能让我走向正确的方向吗?

+1

顺便说一句,'junit.framework.TestCase'类是JUnit 3的一部分.JUnit 4有许多改进,所以我建议你使用它。 –

回答

2

javac目标不从源和目标目录除了指定任何东西 - 它不添加任何类路径条目;您需要为适当的JUnit jar文件添加一个条目。有关更多详细信息,请参见javac task documentation。您可能需要将JUnit的路径指定为类路径属性,嵌套元素或对其他地方声明的路径的引用。

1

你需要指定包含你的.class文件和你的外部罐子(如junit)的目录。

例如

<!-- Populates a class path containing our classes and jars --> 
<path id="dist.classpath"> 
    <fileset dir="${lib}"/> 
    <pathelement path="${build}"/> 
</path> 
<!-- Compile the java code place into ${build} --> 
<target name="compile" depends="-dirty" description="Compile the source."> 
    <javac srcdir="${source}" destdir="${build}" includeantruntime="false"> 
     <classpath refid="dist.classpath"/> 
     <exclude name="${test.relative}/**/*"/> 
    </javac> 
</target> 

这里是我把那摘自情况下,你需要如何设置等常见的事情(艾玛的javadoc,等等)的想法完整的文件

<project name="imp" default="dist" basedir=".."> 

<description>Buildscript for IMP</description> 

<property name="source" location="src"/> 
<property name="lib" location="lib"/> 
<property name="history" location="test_history"/> 
<property name="web-tests" location="/var/www/tests"/> 
<property name="web-files" location="/var/www/files"/> 
<property name="web-javadoc" location="/var/www/javadoc"/> 
<property name="web-emma" location="/var/www/emma"/> 
<property name="emma.dir" value="${lib}"/> 
<property name="test" location="${source}/imp/unittest"/> 
<property name="test.relative" value="imp/unittest"/> 
<property name="javadoc-theme" value="tools/javadoc-theme"/> 

<!-- directories for generated files --> 
<property name="build" location="build"/> 
<property name="build-debug" location="debug"/> 
<property name="build-coverage" location="coverage"/> 
<property name="dist" location="dist"/> 
<property name="reports" location="reports"/> 
<property name="coverage-emma" location="${reports}/coverage/emma"/> 

<!-- Populates a class path containing our classes and jars --> 
<path id="dist.classpath"> 
    <fileset dir="${lib}"/> 
    <pathelement path="${build}"/> 
</path> 
<path id="debug.classpath"> 
    <fileset dir="${lib}"/> 
    <pathelement path="${build-debug}"/> 
</path> 

<!-- import emma. This classpath limits the coverage to just our classes --> 
<path id="debug.imp.classpath"> 
    <pathelement path="${build-debug}"/> 
</path> 
<taskdef resource="emma_ant.properties" classpathref="debug.classpath"/> 

<!-- 
    Shouldn't ever need to use this from the command line. IRC saith that the "private" 
    internal use only sort of targets are prefixed with '-'. 
    dirty because it's the opposite of the 'clean' target. 
--> 
<target name="-dirty"> 
    <tstamp/> 
    <mkdir dir="${build}"/> 
    <mkdir dir="${build-debug}"/> 
    <mkdir dir="${build-coverage}"/> 
    <mkdir dir="${dist}"/> 
    <mkdir dir="${reports}"/> 
    <mkdir dir="${coverage-emma}"/> 
</target> 

<!-- clean up all the generated files and direcories --> 
<target name="clean" description="Deletes all files and directories created by this script."> 
    <delete dir="${build}"/> 
    <delete dir="${build-debug}"/> 
    <delete dir="${build-coverage}"/> 
    <delete dir="${dist}"/> 
    <delete dir="${reports}"/> 
    <delete dir="${coverage-emma}"/> 
</target> 

<!-- Compile the java code place into ${build} --> 
<target name="compile" depends="-dirty" description="Compile the source."> 
    <javac srcdir="${source}" destdir="${build}" includeantruntime="false"> 
     <classpath refid="dist.classpath"/> 
     <exclude name="${test.relative}/**/*"/> 
    </javac> 
</target> 

<!-- Compile the java code with debug info place into ${build} --> 
<target name="compile-debug" depends="-dirty" description="Compile the source with debug information."> 
    <javac 
     srcdir="${source}" 
     destdir="${build-debug}" 
     includeantruntime="false" 
     debug="true" 
     debuglevel="lines,vars,source" 
    > 
     <classpath refid="debug.classpath"/> 
    </javac> 
</target> 

<!-- roll up everyting into a single jar file --> 
<target name="dist" depends="clean, compile" description="Generate the distribution file for IMP."> 
    <!-- Copy the library .jars to the directory where the IMP distribution will be located --> 
    <copy todir="${dist}"> 
     <fileset dir="${lib}"/> 
    </copy> 

    <!-- TODO: Generate the MANIFEST.MF file on the fly --> 
    <jar jarfile="${dist}/imp.jar" basedir="${build}" manifest="tools/MANIFEST.MF"/> 

    <!-- dump to web server --> 
    <copy todir="${web-files}"> 
     <fileset dir="${dist}"/> 
    </copy> 
</target> 

<!-- build and run the tests then report the results in HTML --> 
<target name="test" depends="compile-debug" description="Run all the JUnit tests and outputs the results as HTML."> 
    <!-- run the tests --> 
    <junit printsummary="true" haltonerror="false" haltonfailure="false"> 
     <classpath refid="debug.classpath"/> 
     <formatter type="xml"/> 
     <batchtest fork="true" todir="${reports}"> 
      <fileset dir="${source}"> 
       <include name="${test.relative}/**/*Test*.java"/> 
       <exclude name="${test.relative}/**/AllTests.java"/> 
      </fileset> 
     </batchtest> 
    </junit> 

    <!-- report the results --> 
    <junitreport todir="${reports}"> 
     <fileset dir="${reports}" includes="TEST-*.xml"/> 
     <report todir="${reports}"/> 
    </junitreport> 

    <!-- update the latest results file to be commited --> 
    <copy file="${reports}/TESTS-TestSuites.xml" tofile="${history}/test-results-latest.xml"/> 

    <!-- dump to webserver --> 
    <copy todir="${web-tests}"> 
     <fileset dir="${reports}"/> 
    </copy> 
</target> 

<!-- run emma code coverage tool and publish results in HTML --> 
<target name="emma" depends="compile-debug" description="Checks code coverage with Emma."> 
    <!-- put the magic emma juice into the classes --> 
    <emma> 
     <instr 
      instrpathref="debug.imp.classpath" 
      destdir="${coverage-emma}/instr" 
      metadatafile="${coverage-emma}/metadata.emma" 
      merge="true" 
     /> 
    </emma> 

    <!-- run the tests --> 
    <junit fork="true" printsummary="true" haltonerror="false" haltonfailure="false"> 
     <classpath> 
      <pathelement location="${coverage-emma}/instr"/> 
      <path refid="debug.classpath"/> 
     </classpath> 
     <batchtest fork="true" todir="${reports}"> 
      <fileset dir="${source}"> 
       <include name="${test.relative}/**/*Test*.java"/> 
       <exclude name="${test.relative}/**/AllTests.java"/> 
      </fileset> 
     </batchtest> 
     <jvmarg value="-Demma.coverage.out.file=${coverage-emma}/coverage.emma"/> 
     <jvmarg value="-Demma.coverage.out.merge=true"/> 
    </junit> 

    <!-- publish the coverage report --> 
    <emma> 
     <report sourcepath="${source}" verbosity="verbose"> 
      <fileset dir="${coverage-emma}"> 
       <include name="*.emma"/> 
      </fileset> 

      <html outfile="${web-emma}/index.html"/> 
     </report> 
    </emma> 
</target> 

<!-- publish javadoc --> 
<target name="javadoc" description="Creates javadoc for IMP."> 
    <delete dir="${web-javadoc}"/> 
    <javadoc 
      sourcepath="${source}" 
      defaultexcludes="no" 
      destdir="${web-javadoc}" 
      author="true" 
      version="true" 
      use="true" 
      windowtitle="IMP: Integrated Mechanisms Program" 
      overview="${source}/overview.html" 
      classpathref="debug.classpath" 
      stylesheetfile="${javadoc-theme}/stylesheet.css" 
    /> 
    <copy file="${javadoc-theme}/javadoc.jpg" tofile="${web-javadoc}/javadoc.jpg"/> 
</target> 

<target name="all" description="Runs test, emma, javadoc, and dist targets."> 
    <antcall target="test"/> 
    <antcall target="emma"/> 
    <antcall target="javadoc"/> 
    <antcall target="dist"/> 
</target> 

</project> 
1

月食类路径是从蚂蚁分开环境。在你的构建文件中,当你调用javac时,你需要提供一个classpath属性。

你可以用你的属性的其他文件的顶部定义的类路径,像这样:

<path id="classpath"> 
    <fileset dir="[path to libraries]" includes="**/*.jar" /> 
</path> 

,然后通过设置classpathref属性,像这样使用它在每次调用javac的:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath" /> 
0

如果您发现错误堆栈,你会发现下面的行,就你提到的错误线之上......

[javac的] [搜霸次类文件:C:\ Program Files文件\的Java \ JRE6 \ LIB \资源...

这条线显示在所有为这个Ant目标执行的类路径中可用的罐子。 你绝对不会在这里找到所需的jar,即junit-xxxjar(junit-4.8.2.jar)

现在转到eclipse - > Window - > preferences - > Ant - > Runtime - > Global Entries - >添加jar添加junit-4.8.2jar(你可以在你的项目lib目录中找到)

如果在错误堆栈中围绕Ant-> Runtime - > classpath和类路径相关的错误行,你会理解问题。

希望这可以解决您的问题。