2011-01-30 35 views
14

Sto creando una libreria che include sia codice Clojure che Java, e vorrei poter eseguire una singola suite JUnit di test sull'intera base di codice. Sembra che questo dovrebbe essere possibile dal momento che entrambi sono in esecuzione sulla JVM e c'è un buon interoperabilità Clojure/Java.Test unità JUnit e Clojure

Tuttavia, il codice Clojure attualmente sembra favorire il test delle unità effettuato tramite l'API clojure.test utilizzando "(run-all-tests)" e gli amici.

C'è un buon modo per avvolgere questi test Clojure in una sorta di wrapper in modo che possano essere chiamati automaticamente da JUnit?

(quando dico automaticamente, voglio dire senza ricorrere alla soluzione manuale di scrittura di un caso di test JUnit per avvolgere e chiamare ogni test Clojure singolarmente :-))

+2

probabilmente sarei magra verso Maven su Leiningen –

+2

si può facilmente impostare Maven per questo .. iniziare con [questo] (http://stackoverflow.com/questions/2574649/testing-clojure-in-maven) domanda.. – Nevena

risposta

3

La cosa più semplice da fare sarebbe quella di chiamare run-all-tests da un singolo test JUnit. È possibile acquisire l'output e osservare l'ultima riga che indica il conteggio dei passaggi/errori/errori. Se vedi un errore o un errore, puoi fare fallire il test JUnit.

Tuttavia, se si desidera interagire con ciascun test Clojure, è necessario implementare funzionalità simili a quanto trovato in clojure.test. Vale a dire, per ogni valore in ogni spazio dei nomi cercare una funzione memorizzata nel valore dei metadati :test. Quel valore è la tua funzione di test.

Le righe 661-686 di test.clj forniscono una buona sintesi di come vengono archiviati i test e successivamente vengono eseguiti in Clojure.

2

Attualmente non esiste alcuna integrazione JUnit che conosca. Oltre chiamando run-tutti-i test da un singolo test JUnit come suggerito da @psyllo si può costruire l'integrazione più approfondita come segue:

  1. Costruire una funzione che genera un'istanza di junit.framework.Test per ogni metodo di prova definito nella clojure. Dai un'occhiata a clojure.test/test-ns su come trovare tutti i metodi di prova.
  2. Creare un'istanza di junit.framework.TestSuite che aggiunge tutti i test generati per un determinato ns e AOT compila questa classe di suite.
  3. È possibile chiamare la classe suite da java/junit.