外部 ID を使用すると、テスト パッケージ内のテスト ノードやスイート ノードを一意に識別できます。外部 ID は、各テスト ノードおよび各スイート ノードに対して 1 つのプロパティという形で提供されます。この自動的に生成される 外部 ID は、「~」が前に付いたクラスおよびメソッドの完全修飾名で、テスト メソッドを一意に識別します。
JUnit テストの場合、自動的に生成される 外部 ID では、~<package name>.<class name>#<method name> の形式が使用されます。
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() { ... } }
テスト メソッドに対して、JUnit ランナー「org.junit.runners.Parameterized」と共に 外部 ID を使用することは、サポートされていない点に注意してください。これは、1 つのメソッドを、異なるパラメータで繰り返し実行した場合、外部 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)); } }