Test-Driven Development (TDD)
Clojure.test ist das Unit Testing Framework, welches standardmäßig mit Clojure ausgeliefert wird. Für detaillierte Informationen siehe clojure.test API.
Erste Tests in der REPL
Zuerst muss der clojure.test Namespace mittels use
einbinden:
user=> (use 'clojure.test)
nil
Nun kann das Macro is
verwendet werden, welches auf Equality prüft.
user=> (is (= 4 (+ 2 2)))
true
Bei Erfolg des Tests ist der Rückgabewert true
.
Schlägt der Vergleich fehl, werden zusätzliche Informationen angezeigt.
user=> (is (= 5 (+ 2 2)))
FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:1)
expected: (= 5 (+ 2 2))
actual: (not (= 5 4))
false
Die expected:
Zeile zeigt den originalen Ausdruck, die actual:
Zeile die tatsächliche Ausgabe.
Tests können optional mit dem Makro testing
und einem String als erstes Argument dokumentiert werden:
user=> (testing "Crazy arithmetic" (is (= 5 (+ 2 2))))
FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:1)
Crazy arithmetic
expected: (= 5 (+ 2 2))
actual: (not (= 5 4))
false
Darüber hinaus können Tests mittels deftest
in Gruppen zusammengefasst werden, deren Beschreibungen konkateniert in den Fehlerreports ausgegeben werden.
user=> (deftest test-arithmetic
(testing "Arithmetic"
(testing "with positive integers"
(is (= 4 (+ 2 2)))
(is (= 7 (+ 3 4))))
(testing "with negative integers"
(is (= -4 (+ -2 -3)))
(is (= -1 (+ 3 -4))))))
user=> (test-arithmetic)
FAIL in (test-arithmetic) (NO_SOURCE_FILE:7)
Arithmetic with negative integers
expected: (= -4 (+ -2 -3))
actual: (not (= -4 -5))
nil