所以我试图从这个教程建立一个项目。我运行ant,得到错误。我看到的第一件事是…错误:包junit.framework不存在导入junit.framework.TestCase;教程对可能出现的错误没有明确说明。它只是说我可能没有安装JUnit。我运行的是最新版本的Java,我猜是JUnit附带的。因此,问题就变成了找到它(或者至少确认它存在)并将其添加到构建文件中。我怎么做呢?
build . xml
<project name="cobertura.examples.basic" default="coverage" basedir=".">
<description>
Cobertura - http://cobertura.sourceforge.net/
Copyright (C) 2003 jcoverage ltd.
Copyright (C) 2005 Mark Doliner <thekingant@users.sourceforge.net>
Copyright (C) 2006 Dan Godfrey
Cobertura is licensed under the GNU General Public License
Cobertura comes with ABSOLUTELY NO WARRANTY
</description>
<property file="build.properties" />
<path id="cobertura.classpath">
<fileset dir="${cobertura.dir}">
<include name="cobertura.jar" />
<include name="lib/**/*.jar" />
</fileset>
</path>
<taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>
<target name="init">
<mkdir dir="${classes.dir}" />
<mkdir dir="${instrumented.dir}" />
<mkdir dir="${reports.xml.dir}" />
<mkdir dir="${reports.html.dir}" />
<mkdir dir="${coverage.xml.dir}" />
<mkdir dir="${coverage.summaryxml.dir}" />
<mkdir dir="${coverage.html.dir}" />
</target>
<target name="compile" depends="init">
<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="yes">
<classpath refid="cobertura.classpath" />
</javac>
</target>
<target name="instrument" depends="init,compile">
<!--
Remove the coverage data file and any old instrumentation.
-->
<delete file="cobertura.ser"/>
<delete dir="${instrumented.dir}" />
<!--
Instrument the application classes, writing the
instrumented classes into ${build.instrumented.dir}.
-->
<cobertura-instrument todir="${instrumented.dir}">
<!--
The following line causes instrument to ignore any
source line containing a reference to log4j, for the
purposes of coverage reporting.
-->
<ignore regex="org.apache.log4j.*" />
<fileset dir="${classes.dir}">
<!--
Instrument all the application classes, but
don't instrument the test classes.
-->
<include name="**/*.class" />
<exclude name="**/*Test.class" />
</fileset>
</cobertura-instrument>
</target>
<target name="test" depends="init,compile">
<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
<!--
Note the classpath order: instrumented classes are before the
original (uninstrumented) classes. This is important.
-->
<classpath location="${instrumented.dir}" />
<classpath location="${classes.dir}" />
<!--
The instrumented classes reference classes used by the
Cobertura runtime, so Cobertura and its dependencies
must be on your classpath.
-->
<classpath refid="cobertura.classpath" />
<formatter type="xml" />
<test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />
<batchtest todir="${reports.xml.dir}" unless="testcase">
<fileset dir="${src.dir}">
<include name="**/*Test.java" />
</fileset>
</batchtest>
</junit>
<junitreport todir="${reports.xml.dir}">
<fileset dir="${reports.xml.dir}">
<include name="TEST-*.xml" />
</fileset>
<report format="frames" todir="${reports.html.dir}" />
</junitreport>
</target>
<target name="coverage-check">
<cobertura-check branchrate="34" totallinerate="100" />
</target>
<target name="coverage-report">
<!--
Generate an XML file containing the coverage data using
the "srcdir" attribute.
-->
<cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
</target>
<target name="summary-coverage-report">
<!--
Generate an summary XML file containing the coverage data using
the "srcdir" attribute.
-->
<cobertura-report srcdir="${src.dir}" destdir="${coverage.summaryxml.dir}" format="summaryXml" />
</target>
<target name="alternate-coverage-report">
<!--
Generate a series of HTML files containing the coverage
data in a user-readable form using nested source filesets.
-->
<cobertura-report destdir="${coverage.html.dir}">
<fileset dir="${src.dir}">
<include name="**/*.java"/>
</fileset>
</cobertura-report>
</target>
<target name="clean" description="Remove all files created by the build/test process.">
<delete dir="${classes.dir}" />
<delete dir="${instrumented.dir}" />
<delete dir="${reports.dir}" />
<delete file="cobertura.log" />
<delete file="cobertura.ser" />
</target>
<target name="coverage" depends="compile,instrument,test,coverage-report,summary-coverage-report,alternate-coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports."/>
</project>
当你为Mac抓取最新的JDK时,你确实没有获得JUnit。
虽然从http://junit.org下载并安装最新的junit.jar,并配置ant来查找它会对您有所帮助,但您最好从junit页面在线学习junit,而不是从非常短的cobertura在线教程中学习。这些文档有一个下载和安装指南,这是非常好的(假设你知道类路径是什么),以及一个超级小的攻略,让你开始。
你不会知道类JUnit .framework. testcase是JUnit版本3的一部分,它现在已经非常老了。除非您有遗留代码要处理,否则您可能希望从学习JUnit 4开始,它已经存在多年了。
还有其他使用JUnit的方法。您的IDE可能已经有了JUnit插件。另一种选择是使用Maven。通过在maven项目文件中指定junit, maven将自动为您获取并安装junit。Maven非常复杂,但是一旦您习惯了它,您可能会在所有Java应用程序中使用它。
附录
这是一个使用Maven和JUnit在Mac上工作的完整示例。您需要自己安装的只是JDK和Maven。完成后,为新项目创建一个目录,并只创建三个文件:
- PROJECT_ROOT/pom.xml
- PROJECT_ROOT/src/main/java/com/example/Pair.java
- PROJECT_ROOT/src/测试/java/com/example/PairTest.java
这里是pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>pairs</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
这里是Pair.java
package com.example;
class Pair {
int x, y;
public Pair(int x, int y) {this.x = x; this.y = y;}
public int getX() {return x;}
public int getY() {return y;}
@Override public String toString() {return String.format("(%d,%d)", x, y);}
}
这里是PairTest.java
package com.example;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Test;
public class PairTest {
@Test
public void gettersWork() {
Pair p = new Pair(4, 6);
assertThat(p.getX(), is(4));
assertThat(p.getY(), is(6));
assertThat(p.toString(), is("(4,6)"));
}
}
现在在项目根目录中输入
mvn test
和一切都应该工作。请注意,第一次运行maven时,可能需要大约4分钟的时间来下载无数兆字节的内容。别担心,这很正常。它会为你取水的。
您应该看到的最后几行类似于:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.example.PairTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.308 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
希望对你有帮助。