2013-07-26 3 views
14

В настоящее время я определить следующую функцию в REPL в начале сеанса кодирования:«правильный» способ запуска модульных тестов в Clojure

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

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

user=>(rt) 

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

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

ответ

9

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

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

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

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

+0

+1 для указания тестов - это просто функции нулевой последовательности – liwp

16

большинство людей бежать

lein test 

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

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

Я начал выполнять тесты с 'lein test', но тесты занимают намного больше времени, чем когда-либо, когда они сравнивались с их запуском в REPL. Является ли это ожидаемым, или я делаю это неправильно? –

+1

[clojure.test] (https://github.com/jakemcc/lein-test-refresh), [ожидания] (https://github.com/jakemcc/lein-autoexpect), speclj и midje все поддерживают просмотр изменения файла и автоматически запускать тесты (что быстро, за исключением первой загрузки). Если вы используете emacs, [сидр] (https://github.com/clojure-emacs/cider#upgrading-from-clojure-test-mode) имеет clojure-test-mode, который запускает тесты в emacs поверх repl, что довольно круто. – xhh

5

Я до сих пор впечатлен lein-midje

$ lein midje :autotest

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