Externe IDs werden verwendet, um Testknoten und Testsuiteknoten in Testpaketen eindeutig zu identifizieren. Für jeden Testknoten und jeden Testsuiteknoten ist die Eigenschaft Externe ID verfügbar. Die automatisch generierte Externe ID identifiziert eine eindeutige Testmethode durch den voll qualifizierten Namen der Klasse und der Methode, der "~" vorangestellt wird.
Für JUnit Tests wird das folgende Schema für die automatisch generierte Externe ID verwendet: ~<Testpaket-Name>.<Klassen-Name>#<Methoden-Name>.
Beim Umstrukturieren von JUnit-Testklassen ist die automatische Generierung von Externe ID nicht anwendbar, weil die Ergebnisdaten von Tests, die vor der Umstrukturierung ausgeführt wurden, beim Erstellen eines neuen Tests verloren gehen. In diesem Fall muss die Externe ID für den Test manuell definiert werden. Die umstrukturierte Methode kann erneut eindeutig identifiziert werden, weil die Externe ID unverändert bleibt, wenn ein JUnit-Test verschoben oder der Name eines JUnit-Tests geändert wird. Die Externe ID kann im Quellcode manuell als annotation-Objekt festgelegt werden.
Das folgende Codebeispiel enthält eine solche annotation-Instanz für JUnit-Tests:
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface ExternalId { String externalId(); }
Die annotation-Instanz kann in einem JUnit-Test verwendet werden, um Klassen und Methoden wie unten gezeigt auszuzeichnen:
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() { ... } }
Beachten Sie, dass die Verwendung der Eigenschaft Externe ID mit JUnit runner 'org.junit.runners.Parameterized' bei Testmethoden nicht unterstützt wird, weil der Wert von Externe ID nicht eindeutig ist, wenn die Methode wiederholt mit unterschiedlichen Parametern ausgeführt wird. Um dieses Problem zu umgehen, könnte eine Externe ID auf Klassenebene angegeben werden; auf der Methodenebene muss sie jedoch weggelassen werden. Dazu ein Beispiel:
@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)); } }