2017-08-06 134 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)。当测试失败时,下一步不执行,报告显示在某处,并且代码未部署。

相关问题