我想构建一个包含一组clojure.test
测试的jar文件,然后使用lein test
来运行这些测试。据我所知,:test-paths
仅支持测试源的路径,而不是测试jar。
有没有办法实现这个目标?
答案 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 var
。 var
类似于从pi
之类的符号到打印3.14
的函数的指针。通常我们甚至没有意识到var
就在那里,就像第一次打印输出一样:
(pi) => 3.14
我们调用pi
函数,它像往常一样返回值3.14。
但是,我们可以使用w var
或pi
来获取#'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
循环的作用,我们看到了模拟测试函数t1
和t2
的输出:
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