使用外部 ID

您可以使用外部 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));
  }
 
}
注: JUnit 测试的外部 ID 设置仅可用于使用 JUnit 4.4 或更高版本的测试。