2017-08-06 10 views
2

Je développe une API clojure et je veux à chaque fois que je démarre mon serveur, lancer les tests avant.Comment lancer les tests avant de démarrer le serveur

J'ai trouvé la fonction (run-tests) et (run-all-tests) mais clojure dit que cette fonction n'existe pas dans cet espace de noms. Si je mets (: use clojure.test) à mon ns, la fonction fonctionne, mais elle exécute des tests à partir des librairies que j'utilise et du noyau de clojure.

Voici mon gestionnaire, où j'ai placé la méthode principale, alors je veux que "lein run" exécute mes tests puis démarre le serveur.

(ns clojure-api.handler 
    (:use compojure.core) 
    (:require [compojure.route :as route] 
      [org.httpkit.server :refer [run-server]])) 

(defroutes app-routes 
    ;routes... 
) 

(def app 
    (-> app-routes 
     ;Some middleware)) 

(defn -main 
    [& args] 
    (println "Running bank tests") 
    (run-all-tests) 
    (println "Starting server") 
    (run-server app {:port 3000})) 
+2

En général, vous avez un certain type de configuration de CI qui exécute les tests avant le déploiement. Ce n'est pas une manière typique de gérer les tests en cours. Vous pouvez simplement écrire un script bash qui exécute les tests et, en cas de succès, exécuter le serveur. Cela peut être plus simple à mettre en œuvre? Je suppose que vous n'avez pas besoin d'exécuter les tests de la manière indiquée dans votre question. – Slae

+1

Notez également que, quelle que soit la façon dont vous avez choisi d'exécuter les tests, vous devrez peut-être les placer maintenant sous vos sources habituelles pour les avoir réellement prêts à fonctionner. Par exemple. Si vous voulez faire cela avec votre uberjar, alors les fichiers de test ne font généralement pas partie de l'artefact généré. – cfrick

+0

Je comprends que ce n'est pas une structure typique, mais je voulais exécuter les tests avant le serveur parce que cette application est un projet de collège et cette procédure serait utilisée pour la présentation. – Pituca292

Répondre

1

si votre projet est un projet de Leiningen, vous pouvez définir un alias dans le project.clj qui combinent la gestion und test des tâches comme ceci:

:aliases {"test-and-run" ["do" "test" "run"]} 

;; .lein.sh test-and-run 
1

Vous pouvez spécifier pour ce pour exécuter des tests espaces de noms par (run-tests 'ns-one-test 'ns-two-test).

(defn -main 
    [& args] 
    (println "Running bank tests") 
    (run-tests 'ns-one-test 'ns-two-test) 
    (println "Starting server") 
    (run-server app {:port 3000})) 

Cela fonctionnerait et exécuterait uniquement les tests dans les espaces de noms spécifiés. Comme l'état des commentaires, les tests sont généralement exécutés dans une configuration avant un déploiement (en utilisant par exemple Jenkins, GitLab ou CircleCI). Lorsqu'un test échoue, l'étape suivante n'est pas exécutée, un rapport est affiché quelque part et le code n'est pas déployé.