2009-01-08 11 views
98

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

जब परीक्षण सूट समानांतर करने की बात आती है तो कुछ ऐसे समाधान होते हैं जो मुझे प्रत्येक टेस्ट विधि को समानांतर में एक टेस्ट-क्लास में चलाने की अनुमति देते हैं। लेकिन इन सभी की आवश्यकता है कि मैं परीक्षणों को एक तरफ या दूसरे तरीके से बदलूं।

मुझे सच में लगता है कि एक्स एक्स थ्रेड में एक्स अलग-अलग परीक्षण कक्षाओं को समानांतर में चलाने के लिए यह एक बहुत साफ समाधान होगा। मेरे पास सैकड़ों परीक्षण हैं इसलिए मुझे वास्तव में व्यक्तिगत परीक्षण-वर्गों को थ्रेड करने की परवाह नहीं है।

क्या ऐसा करने का कोई तरीका है?

उत्तर

36

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

+1

लिंक किया गया पृष्ठ कहता है "अधिकांश दोहरे-कोर समाधानों के लिए, समानांतर धागे के साथ चलना वर्तमान में गैर-थ्रेडेड चलाने से कभी भी तेज नहीं है"। क्या ये अब भी एक मामला है? – Raedwald

+2

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

+0

@ रेडवाल्ड अपेक्षा नहीं करता कि * गैर * आईओ-बाध्य यूनिट परीक्षणों के लिए भी बहुत कुछ है जो मैं कहने की कोशिश कर रहा हूं। पोस्टफायर के नए संस्करण पोस्ट में वर्णित 2.5 से भी बेहतर/अधिक कुशल हैं, इसलिए आपको थोड़ा बेहतर परिणाम मिल सकते हैं। – krosenvold

4

TestNG can do that (यह मेरा पहला प्रतिबिंब था - तब मैंने देखा कि आपके पास पहले से ही बहुत सारे टेस्टकेस हैं)।

जुनीट के लिए, parallel-junit पर देखें।

+3

दुर्भाग्य से यह प्रश्न पूछने का उत्तर नहीं है। समानांतर-जूनिट केवल एक एकल परीक्षा कक्षा के भीतर चलता है। टेस्टएनजी भी एक वर्ग के भीतर ही चलता है, और मेरे परीक्षण टेस्टएनजी परीक्षण नहीं होते हैं। – krosenvold

+0

@PlatinumAzure: मैंने लिंक अपडेट किया। मुझे नहीं पता कि यह परियोजना कैसे बनाए रखी जाती है। हाल ही में एक और सवाल पूछा गया था [कई मशीनों पर जूनिट परीक्षण निष्पादन वितरित करें] (http://stackoverflow.com/questions/10690587/running-parallel-junit-tests-on-multiple-remote-machines)। – philant

-2

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

-2

आप Gridgain को आजमा सकते हैं जो आपको एक गणना ग्रिड में अपने परीक्षण वितरित करने देता है।

+1

मैंने ग्रिडगेन समाधान की कोशिश की है और इसमें दो प्रमुख समस्याएं हैं। सबसे पहले, आपको ग्रिडगेन को अपने ग्रिड टास्क के क्लासपाथ से बाहर निकलने के लिए कुछ भी कहना है जो ग्रिडगेन भी उपयोग करता है, उदा। वसंत और अपाचे कॉमन्स सामान के बहुत सारे। दूसरा, नेटवर्क क्लासलोडिंग, जबकि एक शानदार विचार, लाइब्रेरीज़ के लिए काम नहीं करता है जो क्लासपाथ खोजना चाहते हैं, उदा। वसंत –

5

tempus-fugit कुछ समान प्रदान करते हैं, विवरण के लिए दस्तावेज़ देखें। यह जुनीट 4.7 पर निर्भर करता है और आप बस अपना परीक्षण @RunWith(ConcurrentTestRunner) पर चिह्नित करते हैं।

चीयर्स

3

आप खुला स्रोत पुस्तकालय की जाँच कर सकते हैं - Test Load Balancer। यह वही करता है जो आप पूछते हैं - समानांतर में विभिन्न परीक्षण वर्ग चलाएं। यह चींटी-जूनिट स्तर पर एकीकृत होता है ताकि आपको वैसे भी अपने परीक्षणों को बदलने की जरूरत न हो। मैं पुस्तकालय के लेखकों में से एक हूं।

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

आखिरकार, इस समस्या को अभी तक कैसे हल किया गया है?

62

उपयोग Maven प्लगइन:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.7.1</version> 
     <configuration> 
      <parallel>classes</parallel> 
      <threadCount>5</threadCount> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 
+9

वास्तव में निश्चित रूप से समर्थित है अगर आप जूनिट 4.7 या बाद में उपयोग कर रहे हैं। [surefire गाइड] (http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html) – jontejj

9

JUnit के प्रयोगात्मक ParallelComputer धावक से प्रेरित होकर मैं अपने खुद के ParallelSuite और ParallelParameterized धावकों का निर्माण किया है। इन धावकों का उपयोग करके आप परीक्षण सूट और पैरामीटर परीक्षणों को आसानी से समानांतर कर सकते हैं।

ParallelSuite.java

public class ParallelSuite extends Suite { 

    public ParallelSuite(Class<?> klass, RunnerBuilder builder) throws InitializationError { 

     super(klass, builder); 

     setScheduler(new RunnerScheduler() { 

      private final ExecutorService service = Executors.newFixedThreadPool(4); 

      public void schedule(Runnable childStatement) { 
       service.submit(childStatement); 
      } 

      public void finished() { 
       try { 
        service.shutdown(); 
        service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
       } catch (InterruptedException e) { 
        e.printStackTrace(System.err); 
       } 
      } 
     }); 
    } 
} 

ParallelParameterized।जावा

public class ParallelParameterized extends Parameterized { 

    public ParallelParameterized(Class<?> arg0) throws Throwable { 

     super(arg0); 

     setScheduler(new RunnerScheduler() { 

      private final ExecutorService service = Executors.newFixedThreadPool(8); 

      public void schedule(Runnable childStatement) { 
       service.submit(childStatement); 
      } 

      public void finished() { 
       try { 
        service.shutdown(); 
        service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
       } catch (InterruptedException e) { 
        e.printStackTrace(System.err); 
       } 
      } 
     }); 
    } 
} 

उपयोग सरल है। बस @RunWith इन समानांतर * कक्षाओं में से एक को एनोटेशन मान बदलें।

@RunWith(ParallelSuite.class) 
@SuiteClasses({ATest.class, BTest.class, CTest.class}) 
public class ABCSuite {} 
+0

सुइट क्लास एनोटेशन स्ट्रिंग स्वीकार करता है – gstackoverflow

2

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

Class[] cls = { TestCase1.class, TestCase2.class }; 
Result result = JUnitCore.runClasses(ParallelComputer.classes(), cls); 
List<Failure> failures = result.getFailures(); 

यह आपको मदद करेगा जब आपको कोड से परीक्षण चलाने की आवश्यकता है क्योंकि इसकी मेवेन या किसी अन्य निर्माण प्रबंधन उपकरण पर निर्भरता नहीं है।

कृपया ध्यान दें कि, यह सभी परीक्षण मामलों को समानांतर में चलाएगा, यदि आपके पास विभिन्न परीक्षण मामलों के बीच कोई निर्भरता है तो इसका परिणाम झूठी सकारात्मक हो सकता है। आपको वैसे भी परस्पर निर्भर परीक्षण नहीं होना चाहिए।

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