java - सशर्त रूप से जुनीट 4 में परीक्षणों को अनदेखा कर रहा है




unit-testing junit (3)

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

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

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

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

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

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

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

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

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

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

अगर किसी ने अतीत में कुछ ऐसा किया है, या इस बारे में एक उज्ज्वल विचार है कि मैं इसके बारे में और कैसे जा सकता हूं, तो मुझे इसके बारे में सुनकर खुशी होगी।


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

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

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

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


जुनीट 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 */
    }
}





ignore