您可以使用外部 ID 唯一标识测试包中的测试节点和套件节点。外部 ID 作为每个测试节点和每个套件节点的属性提供。自动生成的外部 ID 通过类和方法的完全限定名称(带前置的“~”)来标识唯一测试方法。
对于 JUnit 测试,以下架构用于自动生成的外部 ID:~<程序包名称>.<类名>#<方法名称>。
重构 JUnit 测试类时,外部 ID 的自动生成不适用,因为创建新测试时,重构前的测试结果信息将丢失。在这种情况下,必须手动定义测试的外部 ID。重构方法可重新识别,因为在移动 JUnit 测试或更改其名称时,其外部 ID 保持不变。外部 ID 可在源代码中手动设置为批注。
以下代码示例显示了 JUnit 测试的此批注:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface ExternalId {
String externalId();
}可在 JUnit 测试中使用批注功能来批注类别和测试方法,如下所示:
import static org.junit.Assert.*;
import org.junit.Test;
import com.borland.runner.ExternalId;
@ExternalId(externalId="JUnit4test")
public class JUnit4test {
@Test
@ExternalId(externalId="MyExtId1")
public void test1() {
...
}
@Test
@ExternalId(externalId="MyExtId2")
public void test2() {
...
}
}注意,测试方法不支持将外部 ID 与 JUnit 运行器“org.junit.runners.Parameterized”一起使用,因为对于某个具有不同参数的方法的重复运行,外部 ID 并非唯一。一种解决方法是,可以在类级别上指定外部 ID,但必须在方法级别上忽略。如下所示:
@RunWith(Parameterized.class)
@ExternalId(externalId="parameterizedWithExtId")
public class TestCaseParameterizedWithExternalId {
@Parameters
public static Collection<Object[]> parameterFeeder() {
return Arrays.asList(new Object[][] {
{ "param_name1", "param_value1" }, // set of parameters per run, type matching constructor must exist!
{ "param_name3", "param_value3" },
{ "param_name2", "param_value2" },
}
);
}
private String paramName;
private String paramValue;
public TestCaseParameterizedWithExternalId(String paramName, String paramValue) {
this.paramName = paramName;
this.paramValue = paramValue;
}
@Test
public void testWithParams() {
System.out.println(String.format("run with parameter: name='%s', value='%s'", paramName, paramValue));
}
}