"Правильный" способ запуска модульных тестов в Clojure

В настоящее время я определяю следующую функцию в REPL в начале сеанса кодирования:

(defn rt []
  (let [tns 'my.namespace-test]
    (use tns :reload-all)
    (cojure.test/test-ns tns)))

И каждый раз, когда я делаю изменения, я повторно запускаю тесты:

user=>(rt)

Это работало умеренно хорошо для меня. Когда я удаляю тест, я должен перезапустить REPL и переопределить метод, который немного раздражает. Кроме того, я слышал плохие громыхания об использовании функции use, подобной этой. Поэтому мои вопросы:

  • Использует use таким образом, чтобы вызвать у меня проблему по линии?
  • Есть ли более идиоматический рабочий процесс, чем то, что я сейчас делаю?

Ответы

Ответ 1

Я также запускаю тесты в своем REPL. Мне нравится делать это, потому что у меня больше контроля над тестами, и это быстрее из-за того, что JVM уже работает. Однако, как вы сказали, легко попасть в беду. Чтобы очистить вещи, я предлагаю взглянуть на tools.namespace.

В частности, вы можете использовать clojure.tools.namespace.repl/refresh для перезагрузки файлов, которые были изменены в вашем реальном REPL. Там также refresh-all для перезагрузки всех файлов в пути к классам.

Я добавляю tools.namespace в мой профиль :dev в моем ~/.lein/profiles.clj, чтобы у меня он был там для каждого проекта. Затем, когда вы запустите lein repl, он будет включен в путь к классам, но он не просочится в соответствующие зависимости вашего проекта.

Еще одна вещь, которую я буду делать, когда я работаю над тестом, - это потребовать ее в REPL и запустить ее вручную. Тест - это просто функция без аргументов, поэтому вы можете вызвать их как таковые.

Ответ 2

большинство людей запускает

lein test

образуют другой терминал. Который гарантирует, что то, что находится в файлах, - это то, что проверено не тем, что находится в вашей памяти. Использование reload-all может привести к ложным проходам, если вы изменили имя функции и все еще вызываете старое имя.

  • вызов use, как это не проблема в нем, он просто ограничивает вас не иметь конфликтов имен, если вы используете в своих тестах большее пространство имен. До тех пор, пока у вас есть один, все в порядке.
  • Используя lein, вы можете указать единицы измерения и тесты интеграции и легко запустить их в группах с помощью функции тестовых селекторов.

Ответ 3

Я так впечатлен lein-midje

$ lein midje :autotest

Запускает процесс clojure, просматривая файлы src и test, перезагружает связанные пространства имен и запускает тесты, относящиеся к измененному файлу (зависимостям отслеживания). Я использую его с VimShell, чтобы открыть разделенный буфер в vim и открыть как исходный, так и тестовый файл. Я пишу изменение на одно, и (соответствующие) тесты выполняются на панели с разделом.