我想构建一个包含一组clojure.test
测试的 jar 文件,然后lein test
用来运行这些测试。据我所知,:test-paths
仅支持测试源的路径,不支持测试 jar。
有没有办法做到这一点?
我想构建一个包含一组clojure.test
测试的 jar 文件,然后lein test
用来运行这些测试。据我所知,:test-paths
仅支持测试源的路径,不支持测试 jar。
有没有办法做到这一点?
您可以通过手动创建测试运行程序来做到这一点。假设您有一个项目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 的函数。
但是,我们可以使用 wither或var
获得对函数的引用。然后我们使用 var 而不是符号来调用函数。我们看:pi
#'pi
(var pi)
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)
请注意,(dotest ...)
测试 ns 中的每个表单都会tst.demo.core
创建一个在. 我们可以自己调用这些函数,使用我们刚刚检索到的变量。这就是循环的作用,我们看到模拟测试函数的输出和:lein test
doseq
t1
t2
test t1
test t2
最后一步是在via中指定demo.tst
为主 nsproject.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