Come funziona Junit @Rule?


195

Voglio scrivere casi di test per una grande quantità di codice, vorrei conoscere i dettagli della @Rulefunzione di annotazione di JUnit , in modo da poterlo utilizzare per scrivere casi di test. Fornisci alcune risposte o link utili, che forniscano una descrizione dettagliata della sua funzionalità attraverso un semplice esempio.



Ho trovato questo articolo che spiega @Rulepiuttosto bene, in particolare controlla l'ultima sezione "La sequenza degli eventi in dettaglio"
Peter Perháč,

Penso che sia simile al concetto di iniezione, vero?
Chao

Grazie per aver condiviso quel link. Una cosa non è chiara. Quando viene chiamata l'istruzione DEFAULT.evaluate ()? Viene chiamato prima della valutazione () di tutte le regole o dopo tutte? Sto indovinando dopo tutti loro.
MasterJoe2,

@ testerjoe2 puoi scegliere di ignorare completamente la Dichiarazione di default. Puoi scegliere di delegare ad esso o puoi semplicemente sostituirlo del tutto con qualche altra tua Dichiarazione. Non viene chiamato , puoi chiamarlo o no. Quello era al punto 10: "Il metodo assess () dell'istruzione screenshot chiama il metodo assess () dell'istruzione predefinita."
Peter Perháč,

Risposte:


156

Le regole vengono utilizzate per aggiungere funzionalità aggiuntive che si applicano a tutti i test all'interno di una classe di test, ma in modo più generico.

Ad esempio, ExternalResource esegue il codice prima e dopo un metodo di test, senza dover usare @Beforee @After. Utilizzando un ExternalResourcepiuttosto che @Beforee @Afteroffre opportunità per un migliore riutilizzo del codice; la stessa regola può essere utilizzata da due diverse classi di test.

Il design era basato su: Interceptors in JUnit

Per ulteriori informazioni, consultare Wiki JUnit: Regole .


1
Correzione: "Ad esempio, ExternalResource esegue il codice prima e dopo una classe di test ." C'è qualcosa sull'uso di apply () per far funzionare ExternalResource tra i test.
Derekm

62

Le regole Junit funzionano secondo il principio dell'AOP (programmazione orientata all'aspetto). Intercetta il metodo di prova fornendo così l'opportunità di fare alcune cose prima o dopo l'esecuzione di un particolare metodo di prova.

Prendi l'esempio del codice seguente:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

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

Ogni volta che viene eseguito il metodo di prova sopra riportato, viene creata una cartella temporanea che viene eliminata dopo l'esecuzione del metodo. Questo è un esempio di una regola predefinita fornita da Junit.

Un comportamento simile può essere ottenuto anche creando le nostre regole. Junit fornisce l'interfaccia TestRule, che può essere implementata per creare la nostra regola Junit.

Ecco un link utile per riferimento:


4
quindi viene eliminato senza scrivere alcun codice per eliminare / cancellare l'oggetto?
Dror,

guarda l'origine di github.com/junit-team/junit4/blob/master/src/main/java/org/… , la cartella viene creata nel metodo di callback before () ed eliminata nel metodo di callback after (). ..
Pierluigi Vernetto,

1
Per le persone che potrebbero non aver capito perché la TemporaryFolder viene eliminata, è perché è una TemporaryFolder fornita da Junit a fungere da cartella temporanea che viene automaticamente eliminata, ovvero il passaggio di smontaggio fa parte della stessa classe TemporaryFolder.
Mindaugas Bernatavičius il

18

La spiegazione di come funziona:

JUnit racchiude il tuo metodo di test in un oggetto Statement così istruzione ed Execute()esegue il test. Quindi invece di chiamare statement.Execute()direttamente per eseguire il test, JUnit passa l'istruzione a un TestRule con l' @Ruleannotazione. La funzione "applica" del TestRule restituisce una nuova istruzione fornita con il test. Il nuovo Execute()metodo dell'istruzione può chiamare il metodo di esecuzione dell'istruzione del test (oppure no, o chiamarlo più volte) e fare quello che vuole before and after.

Ora, JUnit ha una nuova istruzione che non si limita a eseguire il test e che può passare nuovamente a qualsiasi altra regola prima di chiamare infine Execute.


2
L'istruzione ha metodo valutare non eseguire.
Hemanth,

0

Le regole vengono utilizzate per migliorare il comportamento di ciascun metodo di prova in modo generico. La regola Junit intercetta il metodo di test e ci consente di fare qualcosa prima che un metodo di test inizi l'esecuzione e dopo che un metodo di test è stato eseguito.

Ad esempio, utilizzando la regola @Timeout possiamo impostare il timeout per tutti i test.

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

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

 }

@TemporaryFolder regola viene utilizzata per creare cartelle e file temporanei. Ogni volta che viene eseguito il metodo di test, viene creata una cartella temporanea che viene eliminata dopo l'esecuzione del metodo.

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");

 }


}

Puoi vedere esempi di alcune regole integrate fornite da junit a questo link .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.