Есть ли способ в lein запускать тесты clojure из файла jar?
Я хотел бы создать файл JAR, содержащий набор clojure.test
тесты, а затем использовать lein test
чтобы запустить эти тесты. Насколько я могу сказать, :test-paths
поддерживает только пути к исходному тексту теста, но не тестовые файлы.
Есть ли способ сделать это?
1 ответ
Вы можете сделать это, вручную создав тестовый бегун. Предположим, у вас есть проект demo
и тестирование нс 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 ...)
Форма в тестировании нс 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