2011-10-21 15 views
8

Clojureでのコードの単体テストをclojure.testで書いています。単体テストでの失敗をどうやって予想しますか?

一部のテストでは、APIを無視し、意図的にコードを破り、コードの潜在的な欠陥のドキュメントとして機能します。

ただし、これらのテストの失敗と通常のテストの失敗を区別したいと思います。

clojure.testのドキュメントには何も表示されていません。(is (thrown? ...))は、私たちが必要とするものではありません。

提案がありますか?基本的には、(is (not <condition>))のようなものを探していますが、テストフレームワークには予期されるエラーが記録されます(thisなど)。

+0

"テストフレームワークは予期される失敗を記録する"と言いますと、テストフレームワークは、期待した例外がスローされたためにテストが成功したことを認識する必要がありますか、または3つのアウトカムを認識する必要がありますか?合格、不合格、予期しない失敗があり、後者は明示的に記録されていますか? – 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} 

は、その後、あなたのテストを書くように:予想される障害のメタデータ:なしのみテストを実行しますlein testを呼び出す

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

lein test :expected-failureを呼び出すと、予想される失敗テストが実行されます。多分あなたが望んでいたものではないかもしれませんが、IMHOはthrown?をあちこちに使う必要がありません。少なくともこのようにして予測される失敗は、コードに明示的に記録され、ビルドを妨げることはありません。

1

@andyは、reportの機能を再バインドできると述べています。成功の通過テストになります

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

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

そして、このように、このマクロを使用します。

関連する問題