2013-05-07 12 views
7

जब मैं स्पॉक परीक्षण विफल रहता हूं तो मैं कुछ क्रिया निष्पादित करना चाहता हूं। विशेष रूप से, एक स्क्रीनशॉट लें। क्या यह संभव है? यह कैसे करना है?स्पॉक परीक्षण विफल होने पर कुछ क्रियाएं निष्पादित करें

उत्तर

9

एक श्रोता वर्ग

class ExampleListener extends AbstractRunListener { 

    def void error(ErrorInfo error) { 
    println "Actual on error logic" 
    } 
} 

बनाएं तो है कि प्रत्येक युक्ति

class GlobalSpecExtension implements IGlobalExtension { 

    @Override 
    void visitSpec(SpecInfo specInfo) { 
    specInfo.addListener(new ExampleListener()) 
    } 
} 
के लिए मार डाला है IGlobalExtension के कार्यान्वयन का उपयोग कर प्रत्येक विनिर्देश में जोड़ने

और आखिरकार में org.spockframework.runtime.extension.IGlobalExtension नामक फ़ाइल बनाएं (आमतौर पर यह src/test/resources के तहत होगा यदि आप मेवेन का उपयोग कर रहे हैं) अपने IGlobalExtension कार्यान्वयन के पूर्ण नाम के साथ

com.example.tests.GlobalSpecExtension 
+0

सेवा निर्देशिका में पैकेज के नाम के साथ फ़ाइल बनाने के पीछे तर्कसंगत क्या है? – eddyrokr

3

इसे प्राप्त करने का सबसे अच्छा तरीका एक (वैश्विक या एनोटेशन-संचालित) स्पॉक एक्सटेंशन लिखना है जो AbstractRunListener लागू करता है और पंजीकृत करता है। उदाहरण के लिए, OptimizeRunOrderExtension देखें। वैश्विक एक्सटेंशन को पंजीकृत करने के लिए, IGlobalExtension वर्णनकर्ता देखें।

एक्सटेंशन पर अधिक दस्तावेज़ीकरण नहीं है क्योंकि एपीआई अभी भी परिवर्तन के अधीन हैं। यदि आप इसे सुरक्षित करना चाहते हैं (और कुछ प्रतिबंधों के साथ रह सकते हैं), तो आप इसके बजाय JUnit Rule लागू कर सकते हैं।

एक समस्या जो आप दोनों मामलों में सामना कर सकते हैं वह यह है कि वे वर्तमान spec उदाहरण तक पहुंच प्रदान नहीं करते हैं। यदि आपको इसकी आवश्यकता है, तो आपको एक ही एक्सटेंशन द्वारा पंजीकृत दोनों AbstractRunListener (विफलता के अधिसूचित होने के लिए) और IMethodInterceptor (स्पेक इंस्टेंस को पकड़ने के लिए) दोनों का उपयोग करना पड़ सकता है। (यह मुश्किल नहीं होना चाहिए, लेकिन यह है कि क्या वर्तमान में वहाँ है।)

+0

हाय पीटर! अमान्य करने के लिए और शायद टूटे हुए ड्राइवर उदाहरण को फिर से बनाने के लिए मैं इन दोनों को कैसे जोड़ूं? क्लाउड टेस्ट में यदि मुझे 'वेबड्राइवर अपवाद: सत्र [...] जैसे कुछ प्राप्त होता है तो TIMEOUT के कारण समाप्त कर दिया गया था, मैं श्रोता में त्रुटि को रोक और लॉग कर सकता हूं, लेकिन' ड्राइवर 'या ड्राइवर फैक्ट्री तक पहुंच नहीं है जिसे मैं अमान्य कर सकता हूं। कोई विचार? – kriegaex

3

मैं इसे इस तरह से करने के लिए प्रबंधित किया है:

class ExampleTest extends GebSpec{ 

    static boolean success = false 

    def setup(){ 
     success = false 
    } 

    def cleanup(){ 
     assert success == true, someAction() 
    } 

    def someAction(){ 
    } 

    def "TestCase"(){ 
     expect: 
     /*What you expect here*/ 

     (success = true) != null 
    } 
} 

से पहले प्रत्येक परीक्षण का मामला "सफलता" सेटअप() विधि द्वारा गलत पर सेट है। प्रत्येक परीक्षण मामले के अंत में आप "(सफलता = सत्य)! = शून्य" कथन जोड़ते हैं। इसलिए "सफलता" केवल तभी सच होगी जब परीक्षण मामला पारित हो गया हो। प्रत्येक परीक्षण मामले के बाद क्लीनअप() विधि सत्यापित करेगी कि "सफलता" सत्य है या नहीं। यदि यह विधि नहीं है तो कुछ क्रिया() को बुलाया जाएगा।

0

मैं उपयोगकर्ता 3074543 के उत्तर पर उत्थान या टिप्पणी नहीं कर सकता, लेकिन यह एक एक्सटेंशन बनाने से आसान है। मुझे आसान चाहिए तो मैंने उपयोगकर्ता को छोटा कर दिया है (मेरा मतलब 1-लाइन विधियों का नहीं है)। आप सफलता की बजाय विफलता रिकॉर्डिंग करके तर्क को सरल बना सकते हैं, और एक() सहायक के साथ टाइपिंग को कम कर सकते हैं।

class Test extends spock.lang.Specification { 
    def fail 
    def setup(){ fail = true } 
    def done(){ !(fail = false) } 
    def cleanup(){ fail && doStuffWhenFail() } 
    def 'test things'(){ 
     expect: 
     stuff 
     done() 
    } 
} 
संबंधित मुद्दे