2011-11-28 7 views
6

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

उत्तर

5

इसे प्राप्त करने के कई तरीके हैं। सबसे आसान और सरल है 'परीक्षण' होना जो आपके सूट की शुरुआत और अंत में चल रहा है जो आपके डेटाबेस को स्थापित करता है और फिर वैश्विक ध्वज सेट करता है। आपके @ पहले और @After परीक्षणों में आप इस ध्वज की जांच करते हैं और यदि आवश्यक हो तो सेटअप/टियरडाउन करें।

@RunWith(Suite.class) 
@SuiteClasses({SetupTest.class, RealTest.class, TeardownTest.class}); 

यह सबसे सरल समाधान है, लेकिन यह बहुत अच्छा है, इसलिए एक neater समाधान एक TestRule उपयोग करने के लिए किया जाएगा नहीं है। ExternalResource को विस्तारित करने पर देखें। यह आपके परीक्षण विधियों से घिरे तर्क के बाद & से पहले लागू करता है। यह आपको हर जगह एक ही कोड का पुन: उपयोग करने के लिए, अपने @ पहले और @After विधियों को कारगर करने की अनुमति देगा।

फिर, अपने सूट के लिए, आपको तर्क के पहले/बाद में भी लागू करने की आवश्यकता है। दुर्भाग्यवश, @RunWith (Suite.class) के साथ एनोटेटेड कक्षा वास्तव में तत्काल नहीं है, इसलिए आप उस वर्ग के निर्माता का उपयोग नहीं कर सकते हैं, लेकिन आप Suite का विस्तार कर सकते हैं। तुम ऐसा कैसे चलेगा के आधार पर, आप, निर्माताओं में से एक को लागू करने की आवश्यकता होगी @RunWith एक उदाहरण के रूप का उपयोग करते हुए:

public class MySuite extends Suite { 
    /** 
    * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code> 
    * 
    * @param klass the root class 
    * @param builder builds runners for classes in the suite 
    * @throws InitializationError 
    */ 
    public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError { 
     this(builder, klass, getAnnotatedClasses(klass)); 
     // put your global setup here 
     // set global variable 
    } 
} 

फिर

@RunWith(MySuite.class) 

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

यदि आप अधिक लचीलापन चाहते हैं (केवल विशिष्ट विधियों के लिए सेटअप कोड निष्पादित करें), तो मेरा उत्तर How to define JUnit method rule in a suite? पर देखें।

+0

अधिकांश लिंक मर गए हैं। – Nadar

2

मैं इस प्रकार के काम करने के तरीकों को इंगित करने के लिए जुनीट के @BeforeClass और @AfterClass एनोटेशन का उपयोग करता हूं।

@BeforeClass जावाडोक से:

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

+1

यह एक टेस्ट क्लास फ़ाइल के अंदर कई एनोटेटेड @ टेस्ट विधियों के लिए प्रासंगिक है, जो परिदृश्य नहीं है जिसके साथ मैं काम कर रहा हूं, मुझे इसे कई परीक्षण क्लास के लिए चाहिए। – stdcall

0

आप प्रत्येक टेस्ट सूट में कुछ @BeforeClass कोड डाल सकते हैं, जो एक सामान्य श्रेणी में सहायक वर्ग को प्रस्तुत करता है जो सामान्य सेट अप करता है। सहायक वर्ग में static boolean हो सकता है जो रिकॉर्ड करता है कि सेट अप पहले ही हो चुका है या नहीं। यदि यह पहले से ही किया जा चुका है, तो सहायक वर्ग कुछ भी नहीं करेगा।

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