lein是否有办法从jar文件中运行clojure测试?

时间:2017-06-30 15:27:21

标签: clojure leiningen clojure.test

我想构建一个包含一组clojure.test测试的jar文件,然后使用lein test来运行这些测试。据我所知,:test-paths仅支持测试源的路径,而不是测试jar。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

您可以通过手动创建测试运行器来完成此操作。假设你有一个项目demo和一个测试ns tst.demo.core,如下所示:

(ns tst.demo.core
  (:use demo.core clojure.test)
  (:require
    [tupelo.core :as t] ))
(t/refer-tupelo)

(deftest t1 (println "test t1"))
(deftest t2 (println "test t2"))

src/demo目录下,创建一个测试驱动程序demo.tst,如下所示:

(ns demo.tst
  (:use clojure.test)
  (:require
    [tupelo.core :as t]
    [tst.demo.core :as tdc] )
  (:gen-class))
(t/refer-tupelo)

(defn pi []  (println 3.14))
(spyx (pi))
(spyx (#'pi))

(defn -main
  [& args]
  (spyx (ns-interns 'tst.demo.core))
  (let [tst-vars (vals (ns-interns 'tst.demo.core))]
    (spyx tst-vars)
    (doseq [tv tst-vars]
      (tv))))

我们可以运行我们的驱动程序,它将调用tst.demo.core中的所有测试:

> lein run -m demo.tst
(pi) => 3.14
((var pi)) => 3.14

(ns-interns (quote tst.demo.core)) => {t1 #'tst.demo.core/t1, t2 #'tst.demo.core/t2}

tst-vars => (#'tst.demo.core/t1 #'tst.demo.core/t2)

test t1
test t2

工作原理:

我们有点讨论讨论Clojure varvar类似于从pi之类的符号到打印3.14的函数的指针。通常我们甚至没有意识到var就在那里,就像第一次打印输出一样:

(pi) => 3.14

我们调用pi函数,它像往常一样返回值3.14。

但是,我们可以使用w varpi来获取#'pi函数的(var pi)。然后,我们使用var而不是符号pi来调用pi函数。我们看到:

((var pi)) => 3.14

我们使用ns-interns来获取tst.demo.core命名空间中符号到变量的地图(注意:它是严重,我们有:require [tst.demo.core ...] ns形式的文件顶部。我们打印出这张地图:

(ns-interns (quote tst.demo.core)) => {t1 #'tst.demo.core/t1, t2 #'tst.demo.core/t2}

我们只需要自己的变量,所以我们抓住它们并保存到tst-vars

tst-vars => (#'tst.demo.core/t1 #'tst.demo.core/t2)

请注意,测试ns (dotest ...)中的每个tst.demo.core表单都会创建一个在lein test期间调用的函数。我们可以使用刚检索到的变量来自行调用这些函数。这就是doseq循环的作用,我们看到了模拟测试函数t1t2的输出:

test t1
test t2

最后一步是将demo.tst指定为project.clj中的主要来源

:main demo.tst

应该允许你创建一个uberjar并运行它:

> java  -jar  target/uberjar/demo-0.1.0-SNAPSHOT-standalone.jar             
(pi) => 3.14
((var pi)) => 3.14
(ns-interns (quote tst.demo.core)) => {t1 #'tst.demo.core/t1, t2 #'tst.demo.core/t2}
tst-vars => (#'tst.demo.core/t1 #'tst.demo.core/t2)
test t1
test t2