Как стать автором
Обновить

Юнит тесты в Clojure

Юнит тестирование очень полезная практика. По моему опыту, онa позволяет повысить качество программы и ускоряет её разработку. Неудивительно, что юнит тесты поддерживаются в clojure c самых первых версий. Для запуска тестов в clojure есть пакет clojure.test, который импортируется следующим образом:

(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."))


Он служит хорошей отправной точкой и позволяет писать тесты в правильном месте.
Пишите тесты и радуйтесь, когда они выполняются.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.