Юнит тестирование очень полезная практика. По моему опыту, онa позволяет повысить качество программы и ускоряет её разработку. Неудивительно, что юнит тесты поддерживаются в clojure c самых первых версий. Для запуска тестов в clojure есть пакет clojure.test, который импортируется следующим образом:
После этого можно использовать для тестирования различные полезные функции.
Предположим у Вас есть функция вида:
Её можно протестировать завернув в макрос:
Этот способ вполне имеет право на жизнь, но мне не очень нравится. Код тяжело читать, тесты его загромаждают. Мне больше по душе определение тестов в отдельном, предназначенном для тестов пространстве имен. Как в этом примере:
После того, как нужные тесты определены их можно запустить:
run-tests выполнит тесты в текущем пространстве имен. Можно также указать конкретные пространства имен:
Если же Вы хотите запустить все тесты из всех пространств имен, можно воспользоваться:
Если Вы используете leiningen для управления проектом, то можно запустить тесты с его помощью:
Кстати, при создании нового проекта leiningen сразу же создает рыбу под тесты. Они складываются в папочку test в корне проекта. Там заводится пространство имен project-name.test.core. В нем лежит первый падающий тест:
Он служит хорошей отправной точкой и позволяет писать тесты в правильном месте.
Пишите тесты и радуйтесь, когда они выполняются.
(ns your-test-namespace
(:use clojure.test))
После этого можно использовать для тестирования различные полезные функции.
Предположим у Вас есть функция вида:
(defn add2 [x] (+ x 2))
Её можно протестировать завернув в макрос:
(with-test
(defn add2 [x] (+ x 2))
(is (= 4 (add2 2)) "Add to 2")
(is (= 5 (add2 3)) "Add to 3"))
Этот способ вполне имеет право на жизнь, но мне не очень нравится. Код тяжело читать, тесты его загромаждают. Мне больше по душе определение тестов в отдельном, предназначенном для тестов пространстве имен. Как в этом примере:
(deftest test-adder
(is (= 4 (add2 2)) "Add to 2"))
После того, как нужные тесты определены их можно запустить:
(run-tests)
run-tests выполнит тесты в текущем пространстве имен. Можно также указать конкретные пространства имен:
(run-tests 'your.namespace 'some.other.namespace)
Если же Вы хотите запустить все тесты из всех пространств имен, можно воспользоваться:
(run-all-tests)
Если Вы используете leiningen для управления проектом, то можно запустить тесты с его помощью:
lein test
Кстати, при создании нового проекта leiningen сразу же создает рыбу под тесты. Они складываются в папочку test в корне проекта. Там заводится пространство имен project-name.test.core. В нем лежит первый падающий тест:
(deftest replace-me ;; FIXME: write
(is false "No tests have been written."))
Он служит хорошей отправной точкой и позволяет писать тесты в правильном месте.
Пишите тесты и радуйтесь, когда они выполняются.