Junit @Rule कैसे काम करता है?


195

मैं एक थोक कोड के लिए परीक्षण के मामले लिखना चाहता हूं, मैं JUnit @Ruleएनोटेशन सुविधा का विवरण जानना चाहूंगा , ताकि मैं इसे परीक्षण मामलों को लिखने के लिए उपयोग कर सकूं। कृपया कुछ अच्छे उत्तर या लिंक प्रदान करें, जो एक सरल उदाहरण के माध्यम से इसकी कार्यक्षमता का विस्तृत विवरण देते हैं।


मैं पहले से ही इस लिंक http://cwd.dhemery.com/2011/01/what-junit-rules-are-good-for/ के
Dipak

मैंने पाया कि यह लेख@Rule बहुत अच्छी तरह से समझाता है , विशेष रूप से अंतिम खंड "द सीक्वेंस ऑफ इवेंट्स इन डिटेल" की जांच करें
पीटर पेरोह

मुझे लगता है कि यह इंजेक्शन की अवधारणा के समान है, क्या मैं सही हूं?
चाओ

उस लिंक को शेयर करने के लिए धन्यवाद। एक बात स्पष्ट नहीं है। DEFAULT Statement.ev मूल्यांकन () कब कहा जाता है? क्या इसे सभी नियमों के मूल्यांकन से पहले या सभी के बाद कहा जाता है? मैं उन सभी के बाद अनुमान लगा रहा हूं।
मास्टरजो 2

@ testerjoe2 आप डिफ़ॉल्ट स्टेटमेंट को पूरी तरह से नजरअंदाज करना चुन सकते हैं। आप इसे सौंप सकते हैं या आप इसे केवल अपने स्वयं के कुछ अन्य विवरण के साथ बदल सकते हैं। यह कॉल नहीं किया जाता है , आप इसे कॉल कर सकते हैं या नहीं। यह बिंदु 10 में था: "स्क्रीनशॉट स्टेटमेंट का मूल्यांकन () विधि डिफ़ॉल्ट स्टेटमेंट के मूल्यांकन () विधि को कॉल करता है।"
पीटर पेर्क

जवाबों:


155

नियमों का उपयोग अतिरिक्त कार्यक्षमता को जोड़ने के लिए किया जाता है जो एक परीक्षण वर्ग के भीतर सभी परीक्षणों पर लागू होता है, लेकिन अधिक सामान्य तरीके से।

उदाहरण के लिए, ExternalResource एक परीक्षण विधि से पहले और बाद में कोड का उपयोग करता है, बिना उपयोग किए @Beforeऔर @After। के ExternalResourceबजाय का उपयोग करना @Beforeऔर @Afterबेहतर कोड पुन: उपयोग के लिए अवसर देता है; एक ही नियम का उपयोग दो अलग-अलग परीक्षण कक्षाओं से किया जा सकता है।

डिजाइन पर आधारित था: JUnit में इंटरसेप्टर

अधिक जानकारी के लिए JUnit wiki: नियम देखें


1
सुधार: "उदाहरण के लिए, एक परीक्षण वर्ग से पहले और बाद में बाहरी कोड कोड निष्पादित करता है ।" परीक्षण के बीच चलाने के लिए बाह्य उपकरण प्राप्त करने के लिए लागू () का उपयोग करने के बारे में कुछ है।
डेरेकमे

62

जून नियम AOP (पहलू उन्मुख प्रोग्रामिंग) के सिद्धांत पर काम करते हैं। यह परीक्षण विधि को इस प्रकार स्वीकार करता है कि किसी विशेष परीक्षण विधि के निष्पादन से पहले या बाद में कुछ सामान करने का अवसर प्रदान करता है।

नीचे दिए गए कोड का उदाहरण लें:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

हर बार जब उपरोक्त परीक्षण विधि निष्पादित होती है, तो एक अस्थायी फ़ोल्डर बनाया जाता है और यह विधि के निष्पादन के बाद हटा दिया जाता है। यह जुनित द्वारा प्रदान किए गए एक आउट-ऑफ-द-बॉक्स नियम का एक उदाहरण है।

इसी तरह का व्यवहार हमारे अपने नियम बनाकर भी प्राप्त किया जा सकता है। Junit TestRule इंटरफ़ेस प्रदान करता है, जिसे हमारे अपने Junit Rule को बनाने के लिए कार्यान्वित किया जा सकता है।

यहाँ संदर्भ के लिए एक उपयोगी लिंक है:


4
इसलिए यह ऑब्जेक्ट को हटाने / हटाने के लिए कोई भी कोड लिखे बिना डिलीट हो जाता है?
ड्रोर

github.com/junit-team/junit4/blob/master/src/main/java/org/… के स्रोत को देखें , फ़ोल्डर को पहले () कॉलबैक विधि में बनाया गया है और बाद (कॉलबैक विधि) में हटा दिया गया है। ..
पियरलिगी वर्नेट्टो

1
उन लोगों के लिए जो यह नहीं समझ पाए हैं कि TemporaryFolder क्यों डिलीट हो जाता है, क्योंकि यह एक TemporaryFolder Junit द्वारा प्रदान किया गया टेम्पर्ड फ़ोल्डर है जो स्वचालित रूप से डिलीट हो जाता है - यानी टियरडाउन स्टेप ही TemporaryFolder क्लास का हिस्सा है।
मिन्दुगास बर्नटाविकियस

17

tl; dr के लिए कि यह कैसे काम करता है: JUnit आपके टेस्ट मेथड को स्टेटमेंट ऑब्जेक्ट में बयान करता है। कथन () अपने टेस्ट को चलाता है। फिर कॉलिंग स्टेटमेंट के बजाय। अपने टेस्ट को चलाने के लिए सीधे (), JUnit @Rule एनोटेशन के साथ स्टेटमेंट को एक TestRule में पास करता है। TestRule का "लागू करें" फ़ंक्शन आपके परीक्षण के साथ स्टेटमेंट दिया गया एक नया विवरण देता है। नए स्टेटमेंट एक्सेक्यूट () विधि परीक्षण स्टेटमेंट के निष्पादन विधि (या नहीं या इसे कई बार कॉल कर सकते हैं) को कॉल कर सकते हैं, और जो कुछ भी इसे पहले और बाद में चाहते हैं। अब JUnit का एक नया कथन है जो केवल परीक्षण चलाने से अधिक है, और यह फिर से पास कर सकता है किसी भी अधिक नियमों से पहले Execute को कॉल करने से पहले।


2
स्टेटमेंट में विधि मूल्यांकन होता है जो निष्पादित नहीं होता है।
हेमंत

0

सामान्य तरीके से प्रत्येक परीक्षा पद्धति के व्यवहार को बढ़ाने के लिए नियमों का उपयोग किया जाता है। जूनिट नियम परीक्षण विधि को बाधित करता है और परीक्षण विधि शुरू करने से पहले और परीक्षण विधि निष्पादित होने के बाद हमें कुछ करने की अनुमति देता है।

उदाहरण के लिए, @Timeout नियम का उपयोग करके हम सभी परीक्षणों के लिए टाइमआउट सेट कर सकते हैं।

public class TestApp {
    @Rule
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);

    ......
    ......

 }

@TemporaryFolder नियम का उपयोग अस्थायी फ़ोल्डर, फाइलें बनाने के लिए किया जाता है। हर बार जब परीक्षण विधि निष्पादित की जाती है, तो एक अस्थायी फ़ोल्डर बनाया जाता है और यह विधि के निष्पादन के बाद हटा दिया जाता है।

public class TempFolderTest {

 @Rule
 public TemporaryFolder tempFolder= new TemporaryFolder();

 @Test
 public void testTempFolder() throws IOException {
  File folder = tempFolder.newFolder("demos");
  File file = tempFolder.newFile("Hello.txt");

  assertEquals(folder.getName(), "demos");
  assertEquals(file.getName(), "Hello.txt");

 }


}

आप इस लिंक पर कनिष्ठ द्वारा प्रदान किए गए कुछ अंतर्निहित नियमों के उदाहरण देख सकते हैं ।

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