【问题标题】:How to run tests before start ring server如何在启动环服务器之前运行测试
【发布时间】:2018-01-14 02:55:18
【问题描述】:

我正在开发一个 clojure API,我希望每次启动服务器时都运行它之前的测试。

我找到了函数 (run-tests) 和 (run-all-tests) 但 clojure 说该函数在该命名空间中不存在。如果我将 (:use clojure.test) 放在我的 ns 中,该函数可以工作,但它会从我正在使用的库和 clojure 核心运行测试。

这是我的处理程序,我放置了 main 方法,然后我希望“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}))

【问题讨论】:

  • 通常你有某种类型的 CI 设置,在部署之前运行测试。这不是处理运行测试的典型方式。您可以编写一个运行测试的 bash 脚本,如果成功则运行服务器。那实现起来可能更简单?我假设您不需要以问题中提到的方式专门运行测试。
  • 另请注意,无论您选择以何种方式运行测试,您现在可能必须将它们放在您的常规资源下才能真正让它们准备好运行。例如。如果你想用你的 uberjar 做到这一点,那么测试文件通常不是生成的工件的一部分。
  • 我知道这不是一个典型的结构,但我想在服务器之前运行测试,因为这个应用程序是一个大学项目,这个过程将用于演示。

标签: testing clojure leiningen ring


【解决方案1】:

如果您的项目是 leiningen 项目,您可以在 project.clj 中定义一个别名,将测试和运行任务结合起来,如下所示:

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

;; .lein.sh test-and-run

【讨论】:

    【解决方案2】:

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

    这会起作用,并且只在指定的命名空间中运行测试。

    正如 cmets 所述,测试通常在部署之前的设置中运行(例如使用 Jenkins、GitLab 或 CircleCI)。当测试失败时,不会执行下一步,会在某处显示报告,并且不会部署代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2021-11-21
      • 2013-04-08
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多