2017-08-06 100 views
2

我正在開發一個clojure API,我希望每次啓動我的服務器時,都要在它之前運行測試。如何在啓動環服務器之前運行測試

我找到了函數(run-tests)和(run-all-tests),但clojure說這個函數不存在於這個名字空間。如果我在ns中放入(:使用clojure.test),該函數可以正常工作,但它會從我正在使用的libs和clojure核心運行測試。

這裏是我的處理程序,我放置主要方法,然後我希望「lein run」運行我的測試,然後啓動服務器。

(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

通常你有一些類型的CI設置的運行測試部署之前。這不是處理運行測試的典型方法。你可以寫一個運行測試的bash腳本,如果成功運行服務器。這可能更容易實施?我假設你不需要以你問題中提到的方式專門運行測試。 – Slae

+1

另請注意,無論您選擇何種方式運行測試,您都可能需要將它們置於常規來源之下,才能讓它們準備好運行。例如。如果你想用你的uberjar做到這一點,那麼測試文件通常不是生成的工件的一部分。 – cfrick

+0

我明白這不是一個典型的結構,但我想在服務器之前運行測試,因爲這個應用程序是一個大學項目,這個過程將用於演示。 – Pituca292

回答

1

如果你的項目是一個leiningen項目,您可以定義,結合這樣的測試運行UND任務的project.clj別名:

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

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

您可以通過(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})) 

這將工作,只在指定的命名空間運行測試。

作爲註釋狀態,測試通常在部署前通過設置運行(例如,使用Jenkins,GitLab或CircleCI)。當測試失敗時,下一步不執行,報告顯示在某處,並且代碼未部署。

相關問題