2011-10-21 34 views
8

我們正在使用clojure.test爲我們的Clojure代碼編寫單元測試。我如何期望單元測試失敗?

我們的一些測試忽略了API並故意破壞代碼,以便作爲代碼中潛在缺陷的文檔。

但是,我們想區分這些測試的失敗和正常測試的失敗。

我們還沒有在clojure.test文檔中看到任何建議 - 只有(is (thrown? ...)),這當然不會做我們需要的。

有什麼建議嗎?基本上,我們正在尋找類似(is (not <condition>))的東西,除了測試框架應該記錄預期的失敗 - 例如this

+0

當你說「測試框架應該記錄預期的失敗」時,你的意思是測試框架應該認識到測試通過了,因爲它引發了你期望的異常,或者你的意思是它應該識別三種輸出結果:通過,失敗和預期的失敗,後者是明確記錄的? – user100464

+0

@ user100464:像這樣:http://docs.python.org/library/unittest.html#skipping-tests-and-expected-failures。所以我們想要明確記錄預期的失敗。 –

回答

3

我已經做了測試,當他們'失敗'像這樣拋出一個異常,然後用thrown?來測試異常是否如預期那樣到達。很可能存在一種更優雅的方式,但這可以完成工作。

+0

是的,我擔心這可能是最簡單的方法。 –

0

重新綁定clojure.test中記錄的報告功能。從那裏你可以改變如何處理和報告'失敗'。

0

對於晚會有點遲,我知道,但是如果您使用Leiningen,您可以使用測試選擇器從「正常」構建中排除期望的失敗。在您的project.clj:

:test-selectors {:default #(not :expected-failure %) 
       :expected-failure :expected-failure} 

然後編寫測試爲:

(deftest ^:expected-failure test-with-expected-failure ...) 

調用lein test將僅運行沒有這些測試:預期失敗的元數據。調用lein test :expected-failure將運行您的預期故障測試。也許不是你所希望的,但是恕我直言,比在全國各地使用thrown?更好。至少以這種方式,預期的故障在代碼中明確記錄並且不會干擾構建。

1

由於@andy說你可以重新綁定report函數。

(defmacro should-fail [body] 
    `(let [report-type# (atom nil)] 
    (binding [clojure.test/report #(reset! report-type# (:type %))] 
     ~body) 
    (testing "should fail" 
     (is (= @report-type# :fail))))) 

,並使用此宏是這樣的:

(should-fail (is (= 1 2))) 

這將是成功的測試通過。