Wie funktioniert Junit @Rule?

195

Ich möchte Testfälle für einen Großteil des Codes schreiben. Ich möchte Details zur JUnit- @RuleAnmerkungsfunktion kennen, damit ich sie zum Schreiben von Testfällen verwenden kann. Bitte geben Sie einige gute Antworten oder Links an, die anhand eines einfachen Beispiels eine detaillierte Beschreibung der Funktionalität enthalten.

Dipak
quelle
Ich bin bereits durch diesen Link gegangen http://cwd.dhemery.com/2011/01/what-junit-rules-are-good-for/
Dipak
Ich fand, dass dieser Artikel@Rule s ziemlich gut erklärt , insbesondere den letzten Abschnitt "Die Abfolge der Ereignisse im Detail"
Peter Perháč
Ich denke, es ähnelt dem Konzept der Injektion, habe ich Recht?
Chao
Vielen Dank, dass Sie diesen Link geteilt haben. Eines ist nicht klar. Wann wird die DEFAULT Statement.evaluate () aufgerufen? Wird es vor dem evaluieren () aller Regeln oder nach allen aufgerufen? Ich vermute nach allen.
MasterJoe2
@ testerjoe2 Sie können die Standardanweisung vollständig ignorieren. Sie können sich dafür entscheiden, es zu delegieren, oder Sie können es einfach ganz durch eine andere eigene Erklärung ersetzen. Es wird nicht angerufen , Sie können es anrufen oder nicht. Das war in Punkt 10: "Die evalu () -Methode der Screenshot-Anweisung ruft die evalu () -Methode der Standardanweisung auf."
Peter Perháč

Antworten:

155

Regeln werden verwendet, um zusätzliche Funktionen hinzuzufügen, die für alle Tests innerhalb einer Testklasse gelten, jedoch allgemeiner.

Beispielsweise führt ExternalResource Code vor und nach einer Testmethode aus, ohne @Beforeund verwenden zu müssen @After. Die Verwendung eines ExternalResourceanstatt @Beforeund @Afterbietet Möglichkeiten für eine bessere Wiederverwendung von Code. Die gleiche Regel kann aus zwei verschiedenen Testklassen verwendet werden.

Das Design basierte auf: Interceptors in JUnit

Weitere Informationen finden Sie im JUnit-Wiki: Regeln .

Matthew Farwell
quelle
1
Korrektur: „Zum Beispiel führt ExternalResource Code vor und nach einer Testklasse .“ Die Verwendung von apply () hat etwas damit zu tun, dass die ExternalResource zwischen den Tests ausgeführt wird.
Derek
62

Junit Rules arbeiten nach dem Prinzip der AOP (aspektorientierte Programmierung). Es fängt die Testmethode ab und bietet so die Möglichkeit, einige Dinge vor oder nach der Ausführung einer bestimmten Testmethode zu erledigen.

Nehmen Sie das Beispiel des folgenden Codes:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

Jedes Mal, wenn die obige Testmethode ausgeführt wird, wird ein temporärer Ordner erstellt, der nach der Ausführung der Methode gelöscht wird. Dies ist ein Beispiel für eine von Junit bereitgestellte Out-of-Box-Regel.

Ein ähnliches Verhalten kann auch durch die Erstellung eigener Regeln erreicht werden. Junit bietet die TestRule-Schnittstelle, die implementiert werden kann, um unsere eigene Junit-Regel zu erstellen.

Hier ist ein nützlicher Link als Referenz:

Abhishek Mohanty
quelle
4
wird es also gelöscht, ohne Code zum Löschen / Löschen des Objekts zu schreiben?
Dror
Schauen Sie sich die Quelle von github.com/junit-team/junit4/blob/master/src/main/java/org/… an . Der Ordner wird in der Rückrufmethode before () erstellt und in der Rückrufmethode after () gelöscht. ..
Pierluigi Vernetto
1
Für Personen, die möglicherweise nicht verstanden haben, warum der TemporaryFolder gelöscht wird, liegt es daran, dass es sich um einen von Junit bereitgestellten TemporaryFolder handelt, der als temporärer Ordner dient und automatisch gelöscht wird. Der Teardown-Schritt ist Teil der TemporaryFolder-Klasse.
Mindaugas Bernatavičius
17

tl; dr für die Funktionsweise: JUnit verpackt Ihre Testmethode in ein Anweisungsobjekt, sodass Anweisung.Execute () Ihren Test ausführt. Anstatt Anweisung.Execute () direkt aufzurufen, um Ihren Test auszuführen, übergibt JUnit die Anweisung an eine TestRule mit der Annotation @Rule. Die "Apply" -Funktion der TestRule gibt eine neue Anweisung zurück, die die Anweisung mit Ihrem Test enthält. Die Execute () -Methode der neuen Anweisung kann die Ausführungsmethode der Testanweisung aufrufen (oder nicht oder mehrmals aufrufen) und vorher und nachher tun, was sie will. Jetzt hat JUnit eine neue Anweisung, die mehr als nur den Test ausführt und diese erneut an weitere Regeln übergeben kann, bevor schließlich Execute aufgerufen wird.

Alexander Taylor
quelle
2
Anweisung hat Methode auswerten nicht ausführen.
Hemanth
0

Regeln werden verwendet, um das Verhalten jeder Testmethode generisch zu verbessern. Die Junit-Regel fängt die Testmethode ab und ermöglicht es uns, etwas zu tun, bevor eine Testmethode mit der Ausführung beginnt und nachdem eine Testmethode ausgeführt wurde.

Mit der @ Timeout-Regel können wir beispielsweise das Zeitlimit für alle Tests festlegen.

public class TestApp {
    @Rule
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);

    ......
    ......

 }

Die @ TemporaryFolder- Regel wird verwendet, um temporäre Ordner und Dateien zu erstellen. Jedes Mal, wenn die Testmethode ausgeführt wird, wird ein temporärer Ordner erstellt, der nach der Ausführung der Methode gelöscht wird.

public class TempFolderTest {

 @Rule
 public TemporaryFolder tempFolder= new TemporaryFolder();

 @Test
 public void testTempFolder() throws IOException {
  File folder = tempFolder.newFolder("demos");
  File file = tempFolder.newFile("Hello.txt");

  assertEquals(folder.getName(), "demos");
  assertEquals(file.getName(), "Hello.txt");

 }


}

Beispiele für einige von junit bereitgestellte integrierte Regeln finden Sie unter diesem Link .

Hari Krishna
quelle