我们有一个包含许多JUnit测试类的项目,这些测试类直到最近都在使用Eclipse内部的JUnit实现。为了从ant构建脚本运行我们的测试,我们更改了项目的构建路径,以使用外部junit-4.11.jar和所需的hamcrest-core库。我们的一些测试类在@Parameters注释中使用(name = "{0}")选项的Parameterized JUnit Runner。在使用Eclipse内置的JUnit运行这些测试类时,输出显示的是第一个参数的值,而不仅仅是索引。现在,在使用外部JUnit之后,无论我是从Eclipse内部运行测试还是使用带有"测试"目标的ant构建脚本运行测试,都只显示索引。下面是一个测试类:
package foo;
import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class ParameterTest {
public ParameterTest(String _name, String _value)
{
name = _name;
value = _value;
}
@Parameters(name = "{0}")
public static Iterable<String[]> testData() {
return Arrays.asList(new String[][] {
{ "name1", "value1" },
{ "name2", "value2" } });
}
@Parameter(0)
public String name;
@Parameter(1)
public String value;
@Test
public void test() {
System.out.println(name+value);
}
}
必须添加构造函数,以便从ant脚本运行测试,否则结果是IllegalArgumentException。@Parameter(x)注释可以删除,但这不会改变结果。
编辑:如果我从Eclipse内部运行这个类("run As -> JUnit Test"),我得到"initializationError",失败跟踪显示"java.lang. lang"。异常:测试类应该只有一个公共的零参数构造函数"。如果我用"test"目标从ant构建脚本中运行测试,测试运行没有错误,但输出显示"test[0]"one_answers"test[1]"而不是"test[name1]"one_answers"test[name2]"。
总结:1. 如果我向测试类添加一个构造函数,其中包含我需要的任意多的参数,那么它将无法在Eclipse中运行。2. 如果没有构造函数,测试将在Eclipse中运行,并且测试的命名将正确地从配置的参数中获取。但是,如果没有构造函数,测试将无法从ant脚本运行。
目的是让测试在Eclipse和ant脚本中同时运行,并且在两个场景中都显示正确的名称。
Edit2:根据文档,您可以使用@Parameter来注入参数,也可以使用构造函数。当我编辑上面的测试类并删除@Parameter注释时,它在Eclipse中工作得很好,并在每次运行旁边显示正确的名称。但是,当从ant脚本运行时,它仍然运行正常,但不显示名称,而是显示测试旁边的索引位置。
重要的是将正确的JUnit版本(在本例中为4.11)添加到JUnit ant任务的类路径中。下面是一个编译和执行ParameterTest的简单ant文件。目录结构如下所示:
src
/test/ParameterTest.java
lib
/junit-4.11.jar
/hamcrest-core-1.3.jar
build . xml:
<?xml version="1.0" encoding="UTF-8"?>
<project name="test">
<property name="src" value="src" />
<property name="build" value="target/classes" />
<property name="lib" value="lib" />
<property name="test.result" value="target/test-results" />
<property name="java.version" value="1.8" />
<target name="init">
<mkdir dir="target/test-results" />
<mkdir dir="target/classes" />
</target>
<target name="compile" depends="init">
<javac srcdir="src" destdir="${build}" listfiles="no" deprecation="off" debug="on" nowarn="on"
includeantruntime="true" source="${java.version}" target="${java.version}">
<classpath>
<fileset dir="${lib}" includes="*.jar"/>
</classpath>
</javac>
</target>
<target name="test" depends="compile">
<junit printsummary="on" haltonfailure="no" showoutput="no"
fork="yes"
forkmode="once" tempdir="/tmp">
<formatter type="xml"/>
<classpath>
<!-- adding first the classpath inherited from the shell -->
<pathelement path="${java.class.path}"/>
<!-- add lib folder with junit-4.11.jar -->
<fileset dir="${lib}" includes="*.jar"/>
</classpath>
<classpath location="${build}" />
<batchtest todir="${test.result}">
<!-- location of your compiled Junit classes -->
<fileset dir="${src}">
<include name="**/*Test*.java" />
</fileset>
</batchtest>
</junit>
</target>
使用ant测试执行后,您可以查看target/test-results/test- test. parametertest .xml,并看到以下行:
<testcase classname="test.ParameterTest" name="test[name1]" time="0.0"/>
<testcase classname="test.ParameterTest" name="test[name2]" time="0.0" />