2015-11-14 9 views
7

के साथ समानांतर में चल रहे टेस्ट I एक ही समय में, कई कक्षाओं में @Test के साथ एनोटेटेड प्रत्येक विधि को चलाने के लिए चाहते हैं। कुछ मामलों के लिए, मैं इसे सीमित करना चाहता हूं, और कहूंगा कि केवल 100 कुल किसी भी समय चल सकते हैं। मुझे क्लास रन में किसी भी टेस्ट से पहले @BeforeClass एनोटेशन के साथ विधियों को पसंद करना होगा, और मुझे कक्षा 12 में सभी टेस्ट के बाद एक बार चलाने के लिए @AfterClass एनोटेशन चाहिए। मुझे System.out, System.err, और अपवादों को लिखित रूप से उचित रूप से buffered/कब्जा करने की इच्छा है, ताकि वे अंतःक्रिया न करें, और मैं अंतिम आउटपुट पढ़ सकता हूं और समझ सकता हूं कि क्या हुआ।जूनिट

क्या यह अस्तित्व में है? मेरे पास बड़ी संख्या में स्वतंत्र परीक्षण मामले हैं, और मेरा आवेदन है (मुझे विश्वास है) थ्रेडसेफ। इन परीक्षणों में से कोई भी JVM से निर्भरता नहीं रखता है, और मैं जितना जल्दी हो सके उन्हें पूरा करना चाहता हूं, मेरे हार्डवेयर को दिया।

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

उत्तर

11

आप इसे जुनीट के ParallelComputer (नोट पर अभी भी प्रयोगात्मक माना जाता है) के साथ पूरा कर सकते हैं। यह एक बहुत ही सरल कार्यान्वयन है जिसका समर्थन java.util.concurrent.ExecutorService API द्वारा समर्थित है।
यदि आप उत्सुक हैं कि यह कैसे काम करता है, check out the source

असल में आप JUnitCore.runClasses(Computer, Classes ...) पर कॉल करते हैं और पहले तर्क के लिए ParallelComputer ऑब्जेक्ट में पास करते हैं।

उदाहरण उपयोग:

import org.junit.Test; 
import org.junit.experimental.ParallelComputer; 
import org.junit.runner.JUnitCore; 

public class ParallelComputerExample { 

    @Test 
    public void runAllTests() { 
     Class<?>[] classes = { ParallelTest1.class, ParallelTest2.class }; 

     // ParallelComputer(true,true) will run all classes and methods 
     // in parallel. (First arg for classes, second arg for methods) 
     JUnitCore.runClasses(new ParallelComputer(true, true), classes); 
    } 

    public static class ParallelTest1 { 
     @Test 
     public void test1a() { 
      lookBusy(3000); 
     } 

     @Test 
     public void test1b() { 
      lookBusy(3000); 
     } 
    } 

    public static class ParallelTest2 { 
     @Test 
     public void test2a() { 
      lookBusy(3000); 
     } 

     @Test 
     public void test2b() { 
      lookBusy(3000); 
     } 
    } 

    public static void lookBusy(long ms) { 
     try { 
      Thread.sleep(ms); 
     } catch (InterruptedException e) { 
      System.out.println("interrupted"); 
     } 
    } 
} 

ऊपर कोड 3 सेकंड में चला जाएगा क्योंकि सभी तरीकों और वर्गों समानांतर में भाग रहे हैं।

यह 6 एस में चला जाएगा (क्योंकि सभी वर्ग समानांतर में हैं)। JUnitCore.runClasses(new ParallelComputer(true, false), classes);

यह 6 एस में भी चलाएगा (क्योंकि सभी विधियां समानांतर में हैं)। JUnitCore.runClasses(new ParallelComputer(false, true), classes);

+2

आपको @Test से JUnitCore.runClasses() को कॉल नहीं करना चाहिए। यह परीक्षण रिपोर्ट गड़बड़ कर देगा। देखें: https://github.com/junit-team/junit4/issues/1102 समानांतर में परीक्षण चलाने का असली समाधान रनर या सूट का विस्तार करना है –

2

हाँ, आप कर सकते हैं।

यदि आप मेवेन का उपयोग कर रहे हैं। आप

Maven-अचूक-प्लगइन

वसंत में की मदद ले सकते हैं,

आप देख सकते हैं इस Link

<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> 

समाधान 2: Junit4 समानांतर सुविधा का उपयोग कर प्रदान करता है समांतर कंप्यूटर

0

JUnit Toolbox परीक्षणों के समानांतर निष्पादन के लिए जुनीट धावक प्रदान करता है।

आदेश System.err के उत्पादन मिश्रित नहीं करने के लिए और System.out आप अलग JVMs में परीक्षण, शुरू करने के लिए क्योंकि System.err और System.out वैश्विक हैं में।

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