JUnit 4 में सशर्त रूप से परीक्षणों की अनदेखी करना


365

ठीक है, इसलिए @Ignoreएनोटेशन यह चिन्हित करने के लिए अच्छा है कि टेस्ट केस नहीं चलाया जाना चाहिए।

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

इसलिए मैं रनटाइम पर परीक्षणों को अनदेखा करने में सक्षम होना चाहता हूं, क्योंकि यह सही परिणाम की तरह लगता है (चूंकि परीक्षण रूपरेखा निर्माण को पारित करने की अनुमति देगा लेकिन यह परीक्षण रिकॉर्ड नहीं करेगा)। मुझे पूरा यकीन है कि एनोटेशन मुझे यह लचीलापन नहीं देगा, और मुझे संदेह है कि मुझे कक्षा में प्रश्न के लिए मैन्युअल रूप से टेस्ट सूट बनाने की आवश्यकता होगी। हालाँकि, दस्तावेज़ीकरण में इसके बारे में कुछ भी उल्लेख नहीं किया गया है और एपीआई के माध्यम से यह भी स्पष्ट नहीं है कि यह प्रोग्रामेटिक रूप से कैसे किया जाएगा (यानी मैं कैसे प्रोग्रामेटिक रूप से Testया इसी तरह का एक उदाहरण बना सकता हूं जो @Ignoreएनोटेशन द्वारा बनाई गई समान है ?)।

अगर किसी ने अतीत में कुछ ऐसा ही किया है, या मुझे इस बारे में कोई और पता नहीं है कि मैं इस बारे में कैसे जा सकता हूं, तो मुझे इसके बारे में सुनकर खुशी होगी।

जवाबों:


476

JUnit तरीका रन-टाइम पर ऐसा करना है org.junit.Assume

 @Before
 public void beforeMethod() {
     org.junit.Assume.assumeTrue(someCondition());
     // rest of setup.
 }

आप इसे एक @Beforeविधि या परीक्षण में ही कर सकते हैं, लेकिन एक @Afterविधि में नहीं । यदि आप इसे स्वयं परीक्षण में करते हैं, तो आपकी @Beforeविधि भाग जाएगी। आप इसे @BeforeClassक्लास इनिशियलाइज़ेशन को रोकने के लिए भी कर सकते हैं ।

एक विफलता विफलता के कारण परीक्षण को अनदेखा किया जाता है।

संपादित करें: जून-एक्सट@RunIf से एनोटेशन की तुलना करने के लिए , उनका नमूना कोड इस तरह दिखाई देगा:

@Test
public void calculateTotalSalary() {
    assumeThat(Database.connect(), is(notNull()));
    //test code below.
}

यह उल्लेख करने के लिए नहीं कि Database.connect()इस तरीके से कनेक्शन को पकड़ने और उपयोग करना बहुत आसान है ।


1
@ नोट, यह मेरा अवलोकन बिल्कुल नहीं है। उनकी अनदेखी की जाती है। IDEA परीक्षण धावक उन्हें इस तरह से रिपोर्ट करता है, और JUnit स्रोत कोड पर एक नज़र दिखाता है कि यह परीक्षण की अनदेखी के रूप में रिपोर्ट करता है।
यिशैई

1
उद्धरण के लिए: "भविष्य में, यह बदल सकता है, और एक असफल धारणा के कारण परीक्षण को अनदेखा किया जा सकता है।" यह वास्तव में बदल गया है, जैसा कि 4.5 मैं मानता हूं। वर्तमान javadoc कहता है: "डिफ़ॉल्ट JUnit धावक असफल धारणाओं के साथ परीक्षणों को अनदेखा करता है। कस्टम धावक अलग तरह से व्यवहार कर सकते हैं।" github.com/KentBeck/junit/blob/…
Yishai

4
जुनिट 4.8.1 के साथ ग्रहण 3.6 एक परीक्षण के रूप में झूठी मान्यताओं की रिपोर्ट करता है। चींटी 1.8.1 के साथ।
fijiaaron

8
यह ग्रहण की रिपोर्टें मानने में
मार्टिन

1
@JeffStorey, तो आप चीजों की एक जोड़ी के लिए देख रहे हैं। एक @BeforeClassएनोटेशन है, जहां आप अपनी धारणा को विफल कर सकते हैं, जो पूरी कक्षा को छोड़ देगा। एक और है @ClassRule(ठीक दानेदार नियंत्रण के लिए, लेकिन पूरी कक्षा में, एक बार)।
यिशै

51

आपको Junit-extप्रोजेक्ट चेकआउट करना चाहिए । उनके पास RunIfएनोटेशन है जो सशर्त परीक्षण करता है, जैसे:

@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
    //your code there
}

class DatabaseIsConnected implements Checker {
   public boolean satisify() {
        return Database.connect() != null;
   }
}

[उनके ट्यूटोरियल से लिया गया कोड नमूना]


3
इस जवाब के लिए धन्यवाद - कार्यक्षमता के लिए एक दिलचस्प वैकल्पिक वाक्यविन्यास, हालांकि मैं Assumeसीधे साथ जाऊंगा ताकि एक और निर्भरता का परिचय न हो।
आंद्रेज डोयले

3
मैं व्यक्तिगत रूप से इस समाधान को पसंद करता हूं। यदि आपके पास कई परीक्षण हैं जिन्हें समान शर्तों के आधार पर चलाया जाना चाहिए, तो यह प्रत्येक परीक्षण में Assume का उपयोग करने की तुलना में कहीं अधिक आदर्श होगा। इसके अलावा, अगर इसे विधि के स्तर के बजाय एक वर्ग स्तर पर उपयोग किया जा सकता है, तो यह और भी अधिक आदर्श होगा।
रिचर्ड

मैं इसे पसंद करूंगा, 'क्यूज यह टेस्ट रन को समय पर चलाने में मदद करता है। यह सूट करता है जहां कई यूनिट टेस्ट चलने वाले हैं और आवश्यकता विशेष चेकर पर यूनिट टेस्ट को चलाने की है। मैं वास्तव में यह देखकर चकित हूं कि मावेन रिपॉजिटरी पर जून-एक्सट उपलब्ध नहीं है। हम मावेन प्रोजेक्ट में इसका लाभ कैसे प्राप्त करेंगे।
शंभू

4
एक एनोटेशन @RunIfशर्त को अलग करता है जब एक परीक्षण वास्तविक परीक्षण कोड से चलना चाहिए, जो मुझे लगता है कि अच्छा है। मुझे यह पसंद नहीं है कि इसके लिए एक विशेष परीक्षण धावक की आवश्यकता है। इसलिए मैंने परीक्षणों को अनदेखा करने के लिए एक JUnit नियम लिखा ।
रुडिगर हेरमैन

2
हमारे स्थानीय रिपॉजिटरी में junit-ext jar (यहाँ पाया गया code.google.com/p/junit-ext/downloads/… ) लगाने के बाद और इस @RunIf एनोटेशन को लागू करने के लिए ... कुछ भी नहीं! यह पूरी तरह से नजरअंदाज कर दिया गया है, और मुझे लगता है कि इसका कारण यह हो सकता है कि जूनियर-एक्सट 4.5 जून पर निर्भर करता है। वसंत-परीक्षण के कारण हमें 4.9+ की आवश्यकता है। तो ... ऐसा कभी नहीं हुआ।
मार्क

7

JUnit 4 में, आपके लिए एक अन्य विकल्प यह बताने के लिए एक एनोटेशन बनाना हो सकता है कि परीक्षण को आपके कस्टम मानदंडों को पूरा करने की आवश्यकता है, फिर अपने स्वयं के साथ डिफ़ॉल्ट रनर का विस्तार करें और प्रतिबिंब का उपयोग करते हुए, कस्टम मानदंडों पर अपने निर्णय को आधार बनाएं। यह कुछ इस तरह दिख सकता है:

public class CustomRunner extends BlockJUnit4ClassRunner {
    public CTRunner(Class<?> klass) throws initializationError {
        super(klass);
    }

    @Override
    protected boolean isIgnored(FrameworkMethod child) {
        if(shouldIgnore()) {
            return true;
        }
        return super.isIgnored(child);
    }

    private boolean shouldIgnore(class) {
        /* some custom criteria */
    }
}

हालांकि यह अच्छा और साफ दिखता है, यह वर्तमान संस्करणों के साथ काम नहीं करता है यदि JUnit4, क्योंकि अब विधि की BlockJUnit4ClassRunnerपेशकश नहीं करता है isIgnored
डेव

-2

एक त्वरित नोट: Assume.assumeTrue(condition)बाकी चरणों की अनदेखी करता है लेकिन परीक्षण पास करता है। परीक्षण को विफल करने के लिए, org.junit.Assert.fail()सशर्त विवरण के अंदर का उपयोग करें । समान काम करता है Assume.assumeTrue()लेकिन परीक्षण में विफल रहता है।


5
जैसा कि ऊपर दिए गए जवाबों में कहा गया है, एक असफल धारणा परीक्षण को पारित करने का कारण नहीं बनती है, यह एक अलग स्थिति लौटाती है। कुछ धावक गलती से इसे रिपोर्ट कर सकते हैं जैसे कि यह एक पास था, लेकिन यह परीक्षण धावक में एक कमजोरी / बग है (और डिफ़ॉल्ट JUnit धावक परीक्षण को अनदेखा करता है)। और अपने अंतिम वाक्य के रूप में, परीक्षण को विफल करना विशेष रूप से वह नहीं है जो मैं (एड) करना चाहता हूं।
आंद्रेज डॉयल

ओह ठीक। परीक्षण मेरे मामले में असफल धारणा पर पारित हुए, लेकिन मैं चाहता था कि उन्हें रिपोर्ट के रूप में विफल कर दिया जाए (मैं टेस्ट वॉचर से अपवाद की जाँच कर रहा था)। एक विफलता के कारण मुझे मदद मिली।
TIn TIn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.