Есть ли способ запустить тесты clojure из файла jar?

Я хотел бы создать файл jar, содержащий набор тестов clojure.test, а затем использовать lein test для запуска этих тестов. Насколько я могу судить, :test-paths поддерживает только пути к тестовому источнику, а не тестовые банки.

Есть ли способ сделать это?


person dposada    schedule 30.06.2017    source источник


Ответы (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.

Однако мы можем получить ссылку на 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