2011-09-23 12 views
10

त्वरित पृष्ठभूमि: मैं अब दिनों के लिए एक मेवेन/सरेफायर परीक्षण-चल रही समस्या का शिकार कर रहा हूं, और मैंने इसे परीक्षणों के एक छोटे से संदिग्ध संदिग्ध कर दिया है। मैं जो व्यवहार देख रहा हूं वह पागल है। मैं mvn clean test से शुरू करता हूं: 250 परीक्षण चलते हैं, 0 छोड़ दिया जाता है। अब, मैं संदिग्ध परीक्षण src/test/java में ले जाता हूं और पुनः प्रयास करता हूं: 146 परीक्षण चलते हैं, 0 छोड़ दिया जाता है! मेवेन का उत्पादन नहीं सुराग देता है कि -X ध्वज के साथ भी अन्य परीक्षण नहीं चल रहे हैं।यदि मैं जुनीट 4 में एक टेस्ट क्लास को अनदेखा करता हूं, तो क्या @BeforeClass अभी भी चलता है?

जो मुझे मेरे सवाल के लिए लाता है: कारण मैं परीक्षण 'संदिग्ध' कहते हैं कि पूरी कक्षा @Ignore साथ सजाया गया है है, इसलिए मैं कल्पना कर सकते हैं कि अपने परीक्षण स्रोतों में शामिल बिल्कुल कोई प्रभाव होना चाहिए । तब यह मेरे लिए हुआ - उन वर्गों में @ थ्रॉक्लास/@ आफ्टरक्लास विधियां हैं जो manage a dummy Zookeeper server है। इसके परिणामस्वरूप पहले भद्दा व्यवहार हुआ, यही कारण है कि हमारे पास अनदेखा परीक्षण हैं।

JUnit चल रहा है से पहले/कोड लेकिन परीक्षण अनदेखी के बाद, मुझे पता नहीं क्या हो सकता है है (लेकिन यह शायद सुपर बुरा होगा)। क्या यह हो रहा है? क्या यह होने के लिए माना गया है? यदि हां, तो मैं कैसे चाहिए कहने के लिए "संदर्भ के लिए, यहाँ एक परीक्षण है कि चाहिए काम है, लेकिन फिक्सिंग की जरूरत है" जब यह शामिल @BeforeClass/@AfterClass? क्या नरक इस अचूक/Maven करने के लिए कर रही है कि यह पृथ्वी के चेहरे बंद गिरावट से संबंधित नहीं परीक्षण का कारण बनता है,: इसके अलावा पर्याप्त ब्याज की?

+0

मेरी मशीन पर 'एमवीएन क्लीन टेस्ट' '@ अनदेखा 'वर्ग में' @ फ्रंट क्लास 'नहीं चलाता है। @ छोड़ा गया काउंटर @ इग्नोर क्लास में @ टेस्ट विधियों की संख्या के बावजूद केवल एक ही बढ़ रहा है। (मेवेन 2.2.1, जुनीट 4.9) आपको कुछ कोड और संस्करण संख्याएं संलग्न करनी चाहिए। क्या आप एक कस्टम टेस्ट धावक का उपयोग कर रहे हैं? – palacsint

+0

मैं एक कस्टम धावक का उपयोग नहीं कर रहा हूं। यह मेवेन 3.0.something, जुनीट 4.8.1 है। – Coderer

+0

आपके surefire प्लगइन का संस्करण संख्या क्या है? – palacsint

उत्तर

16

आप @Ignore एनोटेशन के साथ एक परीक्षण है, तो यह @BeforeClass & @AfterClass के लिए सामान्य व्यवहार चलाने पाने के लिए है, या नहीं, परीक्षण के सभी @Ignored कर रहे हैं।

यदि, हालांकि, कक्षा में @ इग्नोर एनोटेशन है, तो @BeforeClass & @AfterClass नहीं चलाया जाता है।

Maven लिए, यदि आप एक विशेष वर्ग में किसी भी परीक्षण चलाने के लिए नहीं करना चाहते हैं, तो आप उन्हें अचूक या फेल सेफ में अनदेखी करने के लिए है। Maven विन्यास को यह जोड़ना (Maven Surefire Plugin देख)

<excludes> 
<exclude>**/FoobarTest.class</exclude> 
</excludes> 
+0

उह है। तो यह जवाब देता है कि "क्या यह इस तरह से काम करता है" सवाल - हालांकि, यह कितना बेवकूफ है, मैं कक्षा के पहले और बाद में कक्षा के लिए दौड़ने के लिए क्यों चाहूंगा जिनके परीक्षण नहीं चल रहे हैं? - लेकिन यह सवाल छोड़ देता है कि कैसे Surefire इतनी अजीब तरह से गलत व्यवहार कर रहा है। ऐसा होने पर कुछ यादृच्छिक, असंबंधित परीक्षण क्यों नहीं चलेंगे? – Coderer

+0

क्या यह संभव है कि आपने अनदेखा किया है कि "पूरी कक्षा @ इग्नोर से सजा है"? – palacsint

+0

उन्होंने कहा कि परीक्षणों को नजरअंदाज कर दिया गया था, कक्षा नहीं। आप सही हैं कि कक्षा को स्वयं अनदेखा किया जा सकता है। –

7

पर्यावरण: JDK 1.6, अचूक प्लगइन 2.9, JUnit 4.8.1, Maven 3.0, 3.0.3, 2.2.1।

import org.junit.AfterClass; 
import org.junit.BeforeClass; 
import org.junit.Ignore; 
import org.junit.Test; 

@Ignore 
public class IgnoreTest { 

    @BeforeClass 
    public static void beforeClass() { 
     System.out.println("BEFORE CLASS"); 
    } 

    @AfterClass 
    public static void afterClass() { 
     System.out.println("AFTER CLASS"); 
    } 

    @Test 
    public void test1() throws Exception { 
     System.out.println("test1"); 
    } 

    @Test 
    public void test2() throws Exception { 
     System.out.println("test2"); 
    } 

    @Test 
    public void test3() throws Exception { 
     System.out.println("test3"); 
    } 
} 

फिर mvn clean test प्रिंट इस:

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.015 sec 

Results : 

Tests run: 1, Failures: 0, Errors: 0, Skipped: 1 

वर्क्स के रूप में आप की उम्मीद

मैं इस परीक्षण वर्ग बनाया। अगर मैं @Ignore हटाने और mvn clean test चलाने इसे फिर से इस प्रिंट:

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest 
BEFORE CLASS 
test2 
test1 
test3 
AFTER CLASS 
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 sec 

Results : 

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 

इसलिए, यह तीन अलग अलग Maven संस्करणों के साथ मेरे लिए काम करता है। @BeforeClass/@AfterClass@Ignore डी कक्षाओं में चलाया गया था।

@BeforeClass/@AfterClass विधियां @Ignore डी परीक्षण कक्षा में चल सकती हैं, तो एक (शायद अधिक) स्थिति होती है।

mvn clean test की
import org.junit.Test; 

public class IgnoreSubTest extends IgnoreTest { 

    @Test 
    public void test4() throws Exception { 
     System.out.println("test4 subclass"); 
    } 

} 

परिणाम::

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.047 sec 
Running hu.palacsint.stackoverflow.q7535177.IgnoreSubTest 
BEFORE CLASS 
test4 subclass 
test1 
test2 
test3 
AFTER CLASS 
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.057 sec 

Results : 

Tests run: 5, Failures: 0, Errors: 0, Skipped: 1 

इस मामले में @BeforeClass और @AfterClass तरीकों चलाता है, क्योंकि वे IgnoreSubTest परीक्षण वर्ग के तरीके हैं यह जब अपने पर ध्यान नहीं दिया वर्ग एक नहीं पर ध्यान नहीं दिया उपवर्ग है है।

+0

दो चीजें: एक, ध्यान दें कि आपका पहला निष्पादन "टेस्ट रन: 1" दिखाता है, भले ही सब कुछ अनदेखा किया गया हो, और "छोड़ा गया: 1" भले ही '@ टेस्ट' से सजाए गए तीन तरीके हों। तो, Surefire (या शायद JUnit?) पहले से ही वहाँ हो गया है। दो, मेरे पास * सबकुछ * पेस्ट करने के लिए बहुत अधिक कोड है, लेकिन मेरा मानना ​​है कि जब मैं कहता हूं कि '@ अनदेखा' वर्ग कई असंबद्ध परीक्षणों को चलाने के कारण नहीं चलाता है, जबकि '@ पहले क्लास' विधियों पर टिप्पणी करते समय समस्या ठीक होती है। मेरी इच्छा है कि मैं समझा सकता हूं * क्यों *। – Coderer

+0

जुनीट ने कहा कि "टेस्ट रन: 5 ... छोड़ा गया: 1" - इसका मतलब है कि उसने 5 परीक्षण चलाने की कोशिश की और 5 में से 1 में '@ अनदेखा' है। मुझे लगता है कि यह सही है। जुनीट बस इस तरह से काम करता है। दूसरे मुद्दे के लिए: आपको अपनी जांच को केवल कुछ परीक्षणों तक सीमित करना चाहिए। अपना कोड सहेजें/प्रतिबद्ध करें, केवल 3-4 प्रासंगिक परीक्षण चुनें और दूसरों को हटाएं और अपने परीक्षणों के इस छोटे से सबसेट के साथ एक बग को पुन: पेश करने का प्रयास करें। फिर अपना प्रश्न संपादित करें :) – palacsint

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

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