4.1 @Deaktiviert
Schauen wir uns nun einige sehr nützliche und beliebte Annotationen des JUnit-Frameworks an. Mit der ersten Annotation können Sie einen bestimmten Test deaktivieren, sodass JUnit ihn nicht aufruft. Dies ist in Fällen erforderlich, in denen Sie feststellen, dass der Test nicht ordnungsgemäß funktioniert oder Sie den Code ändern und der Test versehentlich abbricht.
Wie ich bereits geschrieben habe, werden 99 % der Tests von niemandem unterstützt, sodass sich früher oder später herausstellt, dass sie alle deaktiviert werden. Daher ist diese Anmerkung die erste in der Liste der nützlichen Anmerkungen.
Betrachten Sie ihr Beispiel:
public class AppTest {
@Disabled("Test is temporarily disabled. True, true")
@Test
void testOnDev(){
System.setProperty("ENV", "DEV");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
@Test
void testOnProd(){
System.setProperty("ENV", "PROD");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
Im obigen Beispiel testOnDev()
wird die Methode nicht aufgerufen. Die Annotation kann übrigens @Disabled
unmittelbar vor der Klassendeklaration geschrieben werden, dann werden alle ihre Methoden ignoriert.
@Disabled("Temporarily turned off the test, we will fix it by May 2001")
public class AppTest {
@Test
void testOnDev(){
System.setProperty("ENV", "DEV");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
@Test
void testOnProd(){
System.setProperty("ENV", "PROD");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
4.2 @Nested
Mit JUnit können Sie Testmethoden für verschachtelte Klassen aufrufen. Ich meine verschachtelte Testklassen. Es ist keine Tatsache, dass Sie oft auf sie stoßen, aber es besteht eine solche Möglichkeit, also müssen Sie verstehen, was sie ist.
Um die Methoden einer verschachtelten Klasse vor ihrer Deklaration aufzurufen, müssen Sie eine Annotation schreiben @Nested
. Beispiel:
public class AppTest {
@Nested
public class DevStagingEnvironment {
@Test
void testOnDev(){
System.setProperty("ENV", "DEV");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
@Nested
public class ProductionEnvironment {
@Test
void testOnProd(){
System.setProperty("ENV", "PROD");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
}
Weitere Details finden Sie in der offiziellen Dokumentation .
4.3 @ExtendWith
Eine weitere nützliche Anmerkung ist @ExtendWith
. Höchstwahrscheinlich werden Sie sie sehr oft treffen, also schauen wir sie uns genauer an.
JUnit ist ein leistungsstarkes Framework, mit dem Sie verschiedene Plugins (Erweiterungen) schreiben können, um Ihre Arbeit flexibel anzupassen. Einige Erweiterungen können Statistiken über Tests sammeln, andere können ein In-Memory-Dateisystem emulieren, andere können die Arbeit innerhalb eines Webservers emulieren und so weiter.
Wenn Ihr Code innerhalb eines Frameworks (z. B. Spring) ausgeführt wird, verwaltet dieses Framework fast immer die Erstellung und Konfiguration von Objekten in Ihrem Code . Daher ist ein spezielles Test-Plugin unabdingbar. Beispiele:
Beispiel 1. Die Erweiterung WebServerExtension
übergibt an die aufgerufene Testmethode, URL
um korrekt zu funktionieren.
@Test
@ExtendWith(WebServerExtension.class)
void getProductList(@WebServerUrl String serverUrl) {
WebClient webClient = new WebClient();
// Use WebClient to connect to web server using serverUrl and verify response
assertEquals(200, webClient.get(serverUrl + "/products").getResponseStatus());
}
So beginnen Tests normalerweise, um Code zu testen, der mit dem Spring-Framework funktioniert:
@ExtendWith(SpringExtension.class)
@ExtendWith(MockitoExtension.class)
class TestServiceTest {
@MockBean
TestService service;
@Test
void test() {
assertNotNull(service); // Test succeeds
}
}
SpringExtension
Erstellt eine Testversion des Spring-Frameworks, MockitoExtention
ermöglicht jedoch die Erstellung gefälschter Objekte. Gefälschte Objekte sind ein sehr interessantes Thema, wir werden es auf jeden Fall ansprechen, aber etwas später.
4.4 @Timeout
Lassen Sie uns diese Vorlesung mit einer kleinen und interessanten Anmerkung beenden @Timeout
. Hier können Sie die Zeit für die Ausführung des Tests festlegen. Wenn der Test länger gedauert hat als in der Anmerkung angegeben, gilt er als nicht bestanden.
class TimeoutDemo {
@Test
@Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
void failsIfExecutionTimeExceeds100Milliseconds() {
// test will fail if it takes more than 100 milliseconds
}
}
Damit ist unser Vortrag abgeschlossen.