1

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

有没有办法做到这一点?

4

1 回答 1

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 的函数。

但是,我们可以使用 wither或var获得对函数的引用。然后我们使用 var 而不是符号来调用函数。我们看:pi#'pi(var pi)pipi

((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 testdoseqt1t2

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
于 2017-06-30T19:09:54.117 回答