2013-07-26 11 views
14

Attualmente, definisco la seguente funzione nel REPL all'inizio di una sessione di codifica:Il modo 'giusto' per eseguire unit test in Clojure

(defn rt [] 
    (let [tns 'my.namespace-test] 
    (use tns :reload-all) 
    (cojure.test/test-ns tns))) 

E ogni volta che faccio un cambiamento che eseguire nuovamente il test:

user=>(rt) 

Ha funzionato abbastanza bene per me. Quando rimuovo un test, devo riavviare il REPL e ridefinire il metodo che è un po 'fastidioso. Ho anche sentito brutti rimproveri sull'uso della funzione use in questo modo. Quindi le mie domande sono:

  • L'utilizzo di use causa un problema lungo la linea?
  • C'è un flusso di lavoro più idiomatico di quello che sto facendo attualmente?

risposta

9

Ho eseguito anche i test nel mio REPL. Mi piace farlo perché ho più controllo sui test ed è più veloce grazie alla JVM già in esecuzione. Tuttavia, come hai detto tu, è facile mettersi nei guai. Per pulire le cose, suggerisco di dare un'occhiata a tools.namespace.

In particolare, è possibile utilizzare clojure.tools.namespace.repl/refresh per ricaricare i file modificati nel REPL in tempo reale. C'è anche refresh-all per ricaricare tutti i file sul classpath.

Aggiungo tools.namespace al mio profilo :dev nel mio ~/.lein/profiles.clj in modo da averlo lì per ogni progetto. Quindi quando si esegue lein repl, questo verrà incluso nel classpath, ma non si diffonderà nelle dipendenze appropriate del progetto.

Un'altra cosa che farò quando sto lavorando su un test è quella di richiederlo nel mio REPL ed eseguirlo manualmente. Un test è solo una funzione no-argument, quindi puoi invocarli come tali.

+0

+1 per i test di puntamento sono solo funzioni zero-arity – liwp

16

la maggior parte delle persone corrono

lein test 

forma un terminale diverso. Ciò garantisce che ciò che è nei file è ciò che viene testato e non ciò che è nella tua memoria. L'utilizzo di reload-all può portare a false passate se hai cambiato il nome di una funzione e stai ancora chiamando il vecchio nome da qualche parte.

  • chiamando use del genere non è un problema in sé è, esso vincola solo che non si dispone di conflitti di nome se si utilizzano più spazi dei nomi nei test. Finché ne hai uno, va bene.
  • utilizzando lein consente di specificare l'unità e integration tests e di eseguirli facilmente in gruppi utilizzando la funzione selettori di prova.
+4

Ho iniziato a eseguire i test con 'lein test' ma i test richiedono molto più tempo per essere eseguiti rispetto a eseguirli nella REPL. È previsto o sto sbagliando? –

+1

[clojure.test] (https://github.com/jakemcc/lein-test-refresh), [aspettative] (https://github.com/jakemcc/lein-autoexpect), speclj e midje supportano la visione cambia i file ed esegue automaticamente i test (che è veloce tranne il primo caricamento). Se stai usando emacs, [sidro] (https://github.com/clojure-emacs/cider#upgrading-from-clojure-test-mode) ha una modalità clojure-test che esegue test in emacs su repl, che è piuttosto interessante. – xhh

5

Sono finora impressionato con lein-midje

$ lein midje :autotest

avvia un processo clojure guardare file src e di test, vengono ricaricati gli spazi dei nomi associati ed esegue il test rilevanti per il file modificato (tracciamento delle dipendenze). Lo uso con VimShell per aprire un buffer diviso in vim e avere sia il sorgente sia il file di prova aperti. Scrivo una modifica a uno e i test (rilevanti) vengono eseguiti nel riquadro diviso.