您可以使用外部 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)); } }