2011-10-21 14 views
8

हम clojure.test का उपयोग कर क्लोजर में हमारे कोड के लिए यूनिट परीक्षण लिख रहे हैं।मैं यूनिट परीक्षण में विफलता की अपेक्षा कैसे करूं?

हमारे कुछ परीक्षण एपीआई को अनदेखा करते हैं और कोड में गुप्त कमी के लिए दस्तावेज़ीकरण के रूप में कार्य करने के लिए जानबूझकर कोड तोड़ते हैं।

हालांकि, हम इन परीक्षणों की विफलताओं और सामान्य परीक्षणों की विफलताओं के बीच अंतर करना चाहते हैं।

हमने clojure.test दस्तावेज़ीकरण में केवल कोई सुझाव नहीं देखा है - केवल (is (thrown? ...)), जो निश्चित रूप से हमें नहीं करता है।

कोई सुझाव? असल में, हम (is (not <condition>)) जैसे कुछ ढूंढ रहे हैं, सिवाय इसके कि परीक्षण ढांचे को अपेक्षित विफलता रिकॉर्ड करनी चाहिए - this जैसे कुछ।

+0

जब आप कहते हैं कि "परीक्षण ढांचे को अपेक्षित विफलता रिकॉर्ड करनी चाहिए", तो क्या आपका मतलब है कि परीक्षण ढांचे को यह समझना चाहिए कि परीक्षा उत्तीर्ण हो गई है क्योंकि यह आपके द्वारा अपेक्षित अपवाद फेंक दिया गया है, या आपका मतलब है कि इसे तीन प्रकार के परिणामों को पहचानना चाहिए: पास, विफलताओं, और अपेक्षित विफलताओं, जिनमें से बाद में स्पष्ट रूप से दर्ज किया गया है? – user100464

+0

@ user100464: ऐसा कुछ: http://docs.python.org/library/unittest.html#skipping-tests-and-expected- विफलताओं। तो हम स्पष्ट रूप से अपेक्षित असफलताओं को रिकॉर्ड करना चाहते हैं। –

उत्तर

3

मैंने परीक्षणों को अपवाद फेंक दिया है जब वे इस तरह 'असफल' होते हैं, और फिर thrown? का उपयोग यह जांचने के लिए किया जाता है कि अपवाद अपेक्षित है या नहीं। वहां बहुत अच्छी तरह से एक शानदार तरीका मौजूद हो सकता है, लेकिन यह काम पूरा हो जाता है।

+0

हां, मुझे डर था कि यह सबसे आसान तरीका हो सकता है। –

0

clojure.test में दस्तावेज़ के रूप में रिपोर्ट फ़ंक्शन को रिबंड करें। वहां से आप बदल सकते हैं कि कैसे 'विफलता' को संभाला जाता है और रिपोर्ट किया जाता है।

0

पार्टी के लिए थोड़ा देर हो चुकी है, मुझे पता है, लेकिन यदि आप लीनिंगेन का उपयोग कर रहे हैं तो आप "सामान्य" निर्माण से अपेक्षित विफलताओं को बाहर करने के लिए परीक्षण चयनकर्ताओं का उपयोग कर सकते हैं। अपने 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))) 

संबंधित मुद्दे