2008-12-08 12 views
23

मैं एक (आराम से) webservice पर कुछ कार्यात्मक परीक्षण करना चाहता हूं। परीक्षण में परीक्षण मामलों का एक समूह होता है, जिनमें से प्रत्येक webservice पर कुछ HTTP अनुरोध करता है।जुनीट 4: टेस्ट चलाने से पहले टेस्ट सूट में चीजें सेट करें (जैसे टेस्ट की @BeforeClass विधि, केवल टेस्ट सूट के लिए)

स्वाभाविक रूप से, webservice को चलाने के लिए या परीक्षण विफल हो जाएंगे। :-)

वेब सेवा शुरू करने में कुछ मिनट लगते हैं (यह कुछ भारी डेटा उठाना) करता है, इसलिए मैं इसे जितनी बार संभव हो उतनी बार शुरू करना चाहता हूं (कम से कम सभी टेस्ट केस जो केवल सेवा से संसाधन प्राप्त कर सकते हैं)।

तो परीक्षण परीक्षण के @BeforeClass विधि में परीक्षण चलने से पहले, मुझे टेस्ट सूट में बम स्थापित करने का कोई तरीका है?

उत्तर

1

जुनीट इस तरह की चीज नहीं कर सकता - हालांकि टेस्टएनजी में @BeforeSuite और @AfterSuite एनोटेशन हैं। आम तौर पर, आप इसे बनाने के लिए अपनी बिल्ड सिस्टम प्राप्त करते हैं। मेवेन में, "प्री-इंटीग्रेशन-टेस्ट" और "पोस्ट-इंटीग्रेशन-टेस्ट" चरण हैं। एंट में, आप बस कार्य में चरणों को जोड़ते हैं।

आपका प्रश्न Before and After Suite execution hook in jUnit 4.x का बहुत अधिक डुप्लिकेट है, इसलिए मैं वहां पर सुझावों को देखता हूं।

+0

BeforeSuite और AfterSuite क्यों काम नहीं करता है? – guerda

-3

एक अलग रूप में रूप में, यह एक बुरा विचार इकाई परीक्षण के लिए वास्तव में webservices, डेटाबेस आदि

यूनिट परीक्षण चलाने के लिए सुपर त्वरित होना चाहिए की तरह बाह्य संसाधनों और की देरी 'की एक जोड़ी मिनट की बुला है सूट के प्रत्येक भाग के लिए इसका मतलब यह होगा कि इसे उतना ही नहीं चलाया जाएगा जितना इसे करना चाहिए।

मेरी सलाह: EasyMock की तरह कुछ (http://www.easymock.org/) के साथ इकाई परीक्षण में बाहरी निर्भरता मजाक में

देखो।

फिटनेस (http://fitnesse.org/) या एक होमग्राउन समाधान के साथ एकीकरण परीक्षण का एक अलग सूट बनाएं जो परीक्षण वातावरण के खिलाफ चलता है और जो लगातार चल रहा है।

+0

हाय निक, मेरे यूनिट परीक्षण उस प्रकार की चीजें नहीं करते हैं और सुपरक्विक हैं। मैं कार्यात्मक परीक्षणों के बारे में बात कर रहा था :-) –

0

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

<target name="start.webservice"><!-- starts the webservice... --></target> 
<target name="stop.webservice"><!-- stops the webservice... --></target> 
<target name="unit.test"><!-- just runs the tests... --></target> 

<target name="run.test.suite" 
     depends="start.webservice, unit.test, stop.webservice"/> 

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

21

उत्तर अब आपके सूट के भीतर @ClassRule बनाने के लिए है। नियम पहले या बाद में लागू किया जाएगा (इस पर निर्भर करता है कि आप इसे कैसे कार्यान्वित करते हैं) प्रत्येक टेस्ट क्लास चलाया जाता है। कुछ अलग-अलग आधार वर्ग हैं जिन्हें आप विस्तार/कार्यान्वित कर सकते हैं। कक्षा नियमों के बारे में अच्छा क्या है कि यदि आप उन्हें अज्ञात कक्षाओं के रूप में लागू नहीं करते हैं तो आप कोड का पुन: उपयोग कर सकते हैं! http://java.dzone.com/articles/junit-49-class-and-suite-level-rules

यहाँ उनके उपयोग को वर्णन करने के कुछ नमूना कोड है:

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

पहले सूट परिभाषा:

import org.junit.*; 
import org.junit.rules.ExternalResource; 
import org.junit.runners.Suite; 
import org.junit.runner.RunWith; 


@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
    RuleTest.class, 
}) 
public class RuleSuite{ 

    private static int bCount = 0; 
    private static int aCount = 0; 

    @ClassRule 
    public static ExternalResource testRule = new ExternalResource(){ 
      @Override 
      protected void before() throws Throwable{ 
       System.err.println("before test class: " + ++bCount); 
       sss = "asdf"; 
      }; 

      @Override 
      protected void after(){ 
       System.err.println("after test class: " + ++aCount); 
      }; 
     }; 


    public static String sss; 
} 

और अब परीक्षण वर्ग परिभाषा:

import static org.junit.Assert.*; 

import org.junit.ClassRule; 
import org.junit.Rule; 
import org.junit.Test; 
import org.junit.rules.ExternalResource; 

public class RuleTest { 

    @Test 
    public void asdf1(){ 
     assertNotNull("A value should've been set by a rule.", RuleSuite.sss); 
    } 

    @Test 
    public void asdf2(){ 
     assertEquals("This value should be set by the rule.", "asdf", RuleSuite.sss); 
    } 
} 
+0

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

+0

वास्तव में, कुछ कार्यान्वयन के आधार पर परीक्षण कक्षा पहले या बाद में लागू की जाएगी। ** @ ArtB ** द्वारा प्रदान किए गए उदाहरण में सूट स्तर पर लागू नियम। इसलिए सूट में सभी परीक्षण चलाने से पहले इसे एक बार बुलाया जाएगा और सूट में सभी परीक्षण चलाने के एक बार बाद में चलाया जाएगा। तो ** @ आर्टबी ** का जवाब ठीक काम करता है। – flaz14