"Правильный" способ запуска модульных тестов в 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 и открыть как исходный, так и тестовый файл. Я пишу изменение на одно, и (соответствующие) тесты выполняются на панели с разделом.