2016-12-06 2 views
2

J'ai vu de nombreux projets de Clojure qui désactivent les tests d'intégration par défaut en ajoutant ce paramètre pour project.clj:Comment désactiver les appareils de test quand aucun test n'est en cours dans l'espace de noms actuel?

:test-selectors {:default (complement :integration) 
       :integration :integration} 

Mais, si un espace de noms contient des tests que d'intégration, les luminaires à courir encore quand je lance lein test!

Par exemple, si je lance lein new app test et rendre le contenu de ce core_test.clj:

(defn fixture [f] 
    (println "Expensive setup fixture is running") 
    (f)) 
(use-fixtures :once fixture) 

(deftest ^:integration a-test 
    (println "integration test running")) 

Puis, quand je lance lein test je vois l'appareil en cours d'exécution, même si aucun test ne fonctionnent.

Quelle est la bonne façon de gérer cela dans clojure?

Répondre

3

Une façon d'accomplir ne pas courir le calcul coûteux est de tirer profit du fait que même si les :once appareils fonctionneront indépendamment du fait que il y a des tests à exécuter dans les ns ou non, les :each accessoires ne fonctionnera que sur chaque test en cours.

Au lieu de faire le calcul réel (ou l'acquisition de ressources comme une connexion db, ou faire tout les effets secondaires) dans la fixation :once, nous ne faisons que dans le premier (nous voulons le faire qu'une seule fois!) :each montage , par exemple en train de faire comme suit:

(def run-fixture? (atom true)) 

(defn enable-fixture [f] 
    (println "enabling expensive fixture...") 
    (try 
    (f) 
    (finally (reset! run-fixture? true)))) 

(defn expensive-fixture [f] 
    (if @run-fixture? 
    (do 
     (println "doing expensive computation and acquiring resources...") 
     (reset! run-fixture? false)) 
    (println "yay, expensive thing is done!")) 
    (f)) 

(use-fixtures :once enable-fixture) 
(use-fixtures :each expensive-fixture) 

(deftest ^:integration integration-test 
    (println "first integration test")) 

(deftest ^:integration second-integration-test 
    (println "second integration test")) 

la sortie de lein test sera comme suit (remarquez comment le enable-fixture a courir, mais pas le expensive-fixture cher):

› lein test 

lein test fixture.core-test 
enabling expensive fixture... 

Ran 0 tests containing 0 assertions. 
0 failures, 0 errors. 

Lors de l'exécution lein test :integration, le expensive-fixture s'exécutera exactement une fois:

› lein test :integration 

lein test fixture.core-test 
enabling expensive fixture... 
doing expensive computation and acquiring resources... 
first integration test 
yay, expensive thing is done! 
second integration test 

Ran 2 tests containing 0 assertions. 
0 failures, 0 errors. 
1

Il semble que le projecteur fonctionne même si les tests sont exécutés. Ensuite, vous pourriez mettre la fonctionnalité de l'appareil dans le test lui-même pour contrôler "manuellement" cette installation/démontage. Pseudocode:

(defn run-all-tests [] 
    (do-test-1) 
    ... 
    (do-test-N)) 

(deftest ^:slow mytest 
    (do-setup) 
    (run-all-tests) 
    (do-teardown))