JUnit परीक्षण मामले में 'विफल' का वास्तविक उपयोग क्या है?


जवाबों:


137

कुछ मामले जहां मुझे उपयोगी लगे हैं:

  • एक परीक्षण को चिह्नित करें जो अधूरा है, इसलिए यह विफल रहता है और आपको चेतावनी देता है जब तक कि आप इसे पूरा नहीं कर सकते
  • यह सुनिश्चित करना कि एक अपवाद फेंक दिया गया है:
try{
  // do stuff...
  fail("Exception not thrown");
}catch(Exception e){
  assertTrue(e.hasSomeFlag());
}

ध्यान दें:

JUnit4 के बाद से, यह परीक्षण करने के लिए अधिक सुरुचिपूर्ण तरीका है कि एक अपवाद को फेंक दिया जा रहा है: एनोटेशन का उपयोग करें @Test(expected=IndexOutOfBoundsException.class)

हालांकि, यह काम नहीं करेगा यदि आप अपवाद का निरीक्षण करना चाहते हैं, तो आपको अभी भी आवश्यकता है fail()


5
असफल बनाम अपेक्षित एनोटेशन के सापेक्ष गुणों के बारे में इस ब्लॉग पोस्ट पर विचार करें: blog.jooq.org/2016/01/20/…
lbalazscs

4
@ स्लेसके "यदि आप अपवाद का निरीक्षण भी करना चाहते हैं, तो आपको अभी भी असफल ()" - नहीं चाहिए। ExpectedException तरीका है, देखें github.com/junit-team/junit4/wiki/exception-testing
kraxor

@kraxor: यह सच है, जब मैंने इसका उत्तर लिखा था, तो इसके बारे में पता नहीं था (यह शायद तब आसपास भी नहीं था)।
साल्स्के

14

मान लें कि आप एक -ve प्रवाह के लिए एक परीक्षण केस लिख रहे हैं जहां परीक्षण किए जा रहे कोड को एक अपवाद उठाना चाहिए

try{
   bizMethod(badData);
   fail(); // FAIL when no exception is thrown
} catch (BizException e) {
   assert(e.errorCode == THE_ERROR_CODE_U_R_LOOKING_FOR)
}

10

मुझे लगता है कि सामान्य उपयोग का मामला इसे कॉल करना है जब कोई अपवाद नकारात्मक परीक्षण में नहीं फेंका गया था।

निम्नलिखित छद्म कोड जैसा कुछ:

test_addNilThrowsNullPointerException()
{
    try {
        foo.add(NIL);                      // we expect a NullPointerException here
        fail("No NullPointerException");   // cause the test to fail if we reach this            
     } catch (NullNullPointerException e) {
        // OK got the expected exception
    }
}

3
यदि आप कैच ब्लॉक में कुछ चेक नहीं करते हैं तो आप @ExpectedException (NullNullPointerException.class) विधि एनोटेशन का उपयोग यह घोषित करने के लिए कर सकते हैं कि आप एक अपवाद (विशेष प्रकार का) की अपेक्षा करते हैं।
FrVaBe

8

मैंने इसका उपयोग उस मामले में किया है, जहाँ मेरे @Before विधि में कुछ गड़बड़ हो गई होगी।

public Object obj;

@Before
public void setUp() {
    // Do some set up
    obj = new Object();
}

@Test
public void testObjectManipulation() {
    if(obj == null) {
        fail("obj should not be null");
     }

    // Do some other valuable testing
}

1
हां, परीक्षण पूर्वधारणा अच्छी है। हालाँकि, यदि आप यह सुनिश्चित करना चाहते हैं कि @Beforeविधि सफल हुई, तो संभवत: इसे सीधे उस पद्धति में जाँचना बेहतर होगा। एक बोनस के रूप में, कम से कम JUnit और TestNG भी @Before/ @Afterविधियों से त्रुटियों के लिए एक अलग विफलता की रिपोर्ट करेंगे , ताकि यह देख सकें कि समस्या परीक्षण में ही नहीं थी।
११

4

इस तरह मैं फेल पद्धति का उपयोग करता हूं।

तीन राज्य हैं जो आपके परीक्षण के मामले को समाप्त कर सकते हैं

  1. उत्तीर्ण: परीक्षण के तहत कार्य सफलतापूर्वक निष्पादित और अपेक्षित रूप से डेटा लौटाया
  2. पास नहीं किया गया: परीक्षण के तहत कार्य सफलतापूर्वक निष्पादित किया गया लेकिन लौटा डेटा अपेक्षा के अनुरूप नहीं था
  3. विफल: फ़ंक्शन सफलतापूर्वक निष्पादित नहीं हुआ और यह नहीं था

इरादा (नकारात्मक परीक्षण मामलों के विपरीत जो अपवाद होने की उम्मीद करते हैं)।

यदि आप ग्रहण का उपयोग कर रहे हैं तो तीन राज्यों को क्रमशः एक हरे, नीले और लाल मार्कर द्वारा इंगित किया जाता है।

मैं तीसरे परिदृश्य के लिए असफल संचालन का उपयोग करता हूं।

उदाहरण: सार्वजनिक इंटेगर ऐड (पूर्णांक ए, इंटेगर बी) {रिटर्न न्यू इंटेगर (a.intValue () + b.intValue ())}

  1. उत्तीर्ण मामला: a = new Interger (1), b = new Integer (2) और फ़ंक्शन 3 वापस लौटा
  2. पास नहीं किया गया मामला: a = new Interger (1), b = new Integer (2) और फ़ंक्शन ने अन्य मानों को 3 से लौटाया
  3. विफल मामला: a = null, b = null और फ़ंक्शन NullPointerException को फेंकता है

1
यदि आप JUnit के सोर्स कोड को देखते हैं, तो आप देखेंगे कि अभिकथन उपयोग करते हैं fail()
डेनियल सी। सोबरल

3

उदाहरण के लिए, मैं fail()उन परीक्षणों को इंगित करने के लिए उपयोग करता हूं जो अभी तक समाप्त नहीं हुए हैं (ऐसा होता है); अन्यथा, वे सफल के रूप में दिखाएंगे।

यह शायद इस तथ्य के कारण है कि मैं कुछ प्रकार की अपूर्ण () कार्यक्षमता से अनजान हूं, जो NUnit में मौजूद है।


2

समवर्ती और / या अतुल्यकालिक सेटिंग्स में, आप यह सत्यापित करना चाह सकते हैं कि कुछ विधियाँ (जैसे प्रतिनिधियों, ईवेंट श्रोताओं, प्रतिक्रिया संचालकों, आप इसे नाम देते हैं) को नहीं कहा जाता है। एक तरफ चौंका देने वाला ढांचा, आप fail()परीक्षणों को विफल करने के लिए उन तरीकों से कॉल कर सकते हैं । ऐसे परिदृश्यों में समय-समय पर समाप्त होना एक और प्राकृतिक विफलता की स्थिति है।

उदाहरण के लिए:

final CountDownLatch latch = new CountDownLatch(1);

service.asyncCall(someParameter, new ResponseHandler<SomeType>() {
    @Override
    public void onSuccess(SomeType result) {
        assertNotNull(result);
        // Further test assertions on the result
        latch.countDown();
    }

    @Override
    public void onError(Exception e) {
        fail(exception.getMessage());
        latch.countDown();
    }
});

if ( !latch.await(5, TimeUnit.SECONDS) ) {
    fail("No response after 5s");
}

0

सबसे महत्वपूर्ण उपयोग मामला शायद अपवाद की जाँच है।

जबकि junit4 में जाँच के लिए अपेक्षित तत्व शामिल है यदि कोई अपवाद हुआ, तो ऐसा लगता है कि यह नए junit5 का हिस्सा नहीं है। इसका उपयोग fail()करने का एक और लाभ यह expectedहै कि आप इसे finallyटेस्ट-केस क्लीनअप की अनुमति के साथ जोड़ सकते हैं ।

dao.insert(obj);
try {
  dao.insert(obj);
  fail("No DuplicateKeyException thrown.");
} catch (DuplicateKeyException e) {
  assertEquals("Error code doesn't match", 123, e.getErrorCode());
} finally {
  //cleanup
  dao.delete(obj);
}

जैसा कि एक अन्य टिप्पणी में उल्लेख किया गया है। जब तक आप इसे लागू नहीं कर सकते, तब तक इसे विफल करने के लिए एक परीक्षण होने के बाद यह उचित लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.