2012-06-05 23 views
7

Python-Doctests assoziieren einfache Tests mit dem Quellcode (in Python sind sie in der Funktionsdokumentation). More info and examples here.Clojure entspricht Python doctest?

Gibt es etwas Ähnliches für Clojure?

Ich kenne Unit Tests mit clojure.test, aber auf der Suche nach etwas enger mit der Quelle integriert (in der Regel Unit-Tests sind in verschiedenen Dateien; hier möchte ich den Test "innerhalb" der defn).

Suchen herum gefunden this, aber es scheint sehr un-lispy (die Tests sind im eigentlichen Text, wie Python - sicherlich ein Makro, das defn erweitert wird, wäre vorzuziehen?).

Oder vielleicht gibt es eine andere Möglichkeit, das allgemeine Problem zu lösen, das ist, dass ich einige Tests (in der Regel einfache Dinge, die grundlegende Eigenschaften der Funktion demonstrieren), die besser in der Dokumentation enthalten sind (Ich verwende marginalia) als in separaten Unit-Test-Dateien.

update Hier ist ein Beispiel: Ich habe eine Funktion, die den (Manhattan) Abstand (in Pixel) von einem Rechteck von Pixeln zum Zentrum des Bildes berechnet. Das klingt einfach, wird aber durch Dinge wie den Unterschied in der Bedeutung von "Mitte" für Bilder mit ungeraden oder geraden Pixeln auf Seiten oder dem Teil des Blocks, von dem Sie messen, kompliziert. Also musste ich einige Tests schreiben, nur um den Code richtig zu machen. Und jetzt schaue ich mir die Dokumentation an und es wäre am besten, wenn die Dokumentation diese Tests beinhaltet, weil sie besser erklären, was die Funktion macht ...

Antwort

10

und das Testkennzeichen in Metadaten, http://clojure.org/special_forms

(defn 
^{:doc "mymax [xs+] gets the maximum value in xs using > " 
    :test (fn [] 
      (assert (= 42 (mymax 2 42 5 4)))) 
    :user/comment "this is the best fn ever!"} 
    mymax 
    ([x] x) 
    ([x y] (if (> x y) x y)) 
    ([x y & more] 
    (reduce mymax (mymax x y) more))) 

user=> (test #'mymax) 
:ok 
user=> (doc test) 
------------------------- 
clojure.core/test 
([v]) 
    test [v] finds fn at key :test in var metadata and calls it, 
    presuming failure will throw exception 
nil 
+0

sieht perfekt aus! hatte keine Ahnung, dass es existierte. aber wie machst du es? heißt lein test es nennen? –

+0

Verwenden Sie die Testfunktion: (test # 'mymax), doc: http://clojuredocs.org/clojure_core/clojure.core/test –

1

Wie wäre es mit: pre und: post expressions? http://blog.fogus.me/2009/12/21/clojures-pre-and-post/

+0

oh, das ist nett und ganz in der Nähe, aber es mir konkrete Beispiele gibt nicht nachlässt. Ich werde ein Beispiel zu der Frage hinzufügen, die besser zeigen könnte, nach was ich suche. –

+0

': pre 'und': post' Bedingungen sind gut für Verträge, nicht so gut für Tests. – ivant