Есть ли способ в 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
Другие вопросы по тегам