2012-06-05 103 views
7

Python doctests將簡單測試與源代碼相關聯(在Python中,它們位於函數文檔中)。 More info and examples hereClojure等價於Python doctest?

Clojure有沒有類似的東西?我知道與clojure.test單元測試,但尋找與源更緊密集成的東西(通常單元測試是在不同的文件;這裏我想要在defn裏面進行測試)。

搜索我發現this,但它似乎非常un-lispy(測試是在實際的文本,如Python - 肯定是一個宏,擴展defn將是可取的?)。

或者還有一些解決一般問題的方法,那就是我有一些測試(通常是簡單的事情來演示函數的基本屬性),這些測試會更好地包含在文檔中(我正在使用marginalia)比在單獨的單元測試文件中。

更新下面是一個示例:我有一個函數可以計算從像素矩形到圖像中心的曼哈頓距離(以像素爲單位)。這聽起來很簡單,但是由於諸如「中心」的意思不同而導致圖像的邊緣像素數量爲奇數或偶數,或者您測量的塊的哪一部分會變得複雜。所以我不得不寫一些測試,以便直接獲得代碼。現在我看看文檔,如果文檔包含這些測試,最好是因爲它們解釋比文字更好的功能...

回答

10

和元數據的測試標誌,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

看起來很完美!不知道存在。但你如何運行它? lein測試稱它嗎? –

+0

使用測試函數:(測試#'mymax),doc:http://clojuredocs.org/clojure_core/clojure.core/test –

1

如何:pre和:post表達式? http://blog.fogus.me/2009/12/21/clojures-pre-and-post/

+0

哦,這是可愛,非常接近,但它不會讓我給出具體的例子。我會爲這個問題添加一個示例,以便更好地展示我在尋找的內容。 –

+0

':pre'和':post'條件對於合同是有好處的,對測試來說不是很好。 – ivant