Вы можете сделать это, вручную создав средство запуска тестов. Предположим, у вас есть проект 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.
Однако мы можем получить ссылку на 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
Последний шаг — назначить demo.tst
основным ns в 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
person
Alan Thompson
schedule
30.06.2017