एक मावेन बिल्ड में समानांतर में रनिंग जूनिट परीक्षण?


110

मैं JUnit 4.4 और Maven का उपयोग कर रहा हूं और मेरे पास बड़ी संख्या में लंबे समय से चल रहे एकीकरण परीक्षण हैं।

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

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

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

जवाबों:


75

मावेन प्लगइन का उपयोग करें:

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

12
<समानांतर> वास्तव में अचूक द्वारा समर्थित है यदि आप जूनिट 4.7 या बाद का उपयोग कर रहे हैं। अचूक गाइड
जोंतेजज

42

4.7 से अब TestNG का उपयोग किए बिना समानांतर में परीक्षण चलाना संभव है। वास्तव में यह 4.6 से संभव हो गया है, लेकिन 4.7 में कई सुधार किए जा रहे हैं जो इसे एक व्यवहार्य विकल्प बनाएंगे। आप वसंत के साथ समानांतर परीक्षण भी चला सकते हैं, जिसे आप यहां पढ़ सकते हैं


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

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

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

3
आप कहते हैं कि यह संभव है, लेकिन क्या आप इसकी व्याख्या के लिए एक लिंक शामिल कर सकते हैं? आपका दूसरा लिंक "स्प्रिंग के साथ" के लिए है, जिसमें मुझे कोई दिलचस्पी नहीं है।
कोरी केंडल

@krosenvold लिंक? मैं एक अंतर्निहित समाधान खोजने के लिए संघर्ष कर रहा हूं।
इलान बिआल

10

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

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

5

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

चियर्स


3

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

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

अंत में, इस समस्या को अब तक कैसे हल किया है?


2

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

JUnit के लिए, समानांतर-जूनियर देखें


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

@ प्लेटिनमअज़्योर: मैंने लिंक को अपडेट किया। मुझे नहीं पता कि यह परियोजना कैसे बनी हुई है। एक और सवाल हाल ही में कई मशीनों पर कनिष्ठ परीक्षण निष्पादन को वितरित करने के लिए कहा गया था ।
प्रातः

2

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

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

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

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


0

एक और विकल्प: पनर, एक नया समानांतर जूनियर धावक और मावेन प्लगइन। आपको अपना कोड बदलना नहीं है, इसे अपने pom.xml पर कॉपी करें:

<!-- Disable default surefire based testing -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.20</version>
  <configuration>
    <skip>true</skip>
  </configuration>
</plugin>

<plugin>
  <groupId>com.github.marks-yag</groupId>
  <artifactId>punner-maven-plugin</artifactId>
  <version>${version}</version>
  <configuration>
  </configuration>
  <executions>
    <execution>
      <id>test</id>
      <phase>test</phase>
      <goals>
        <goal>test</goal>
      </goals>
    </execution>
  </executions>
</plugin>

पुनेर समानांतर में परीक्षण विधियों को चला सकते हैं, परीक्षण आउटपुट को अलग और साफ रख सकते हैं।

Punner आपके mvn कंसोल आउटपुट को कम कर देगा, जैसे:

[INFO] --- punner-maven-plugin:0.9.13:test (test) @ ipc ---
[INFO] Punner report directory: /Users/guile/workspace/ipc/target/punner-reports
[INFO]
[INFO] com.github.yag.ipc.IPCTest.testConnectionHandler.............. PASSED
[INFO] com.github.yag.ipc.IPCTest.testSequence....................... PASSED
[INFO] com.github.yag.ipc.IPCTest.testPartialContent................. PASSED
[INFO] com.github.yag.ipc.IPCTest.testResponseContent................ PASSED
[INFO] com.github.yag.ipc.IPCTest.testPingPong....................... PASSED
[INFO] com.github.yag.ipc.IPCTest.testServerClose.................... PASSED
[INFO] com.github.yag.ipc.IPCTest.testServerSideHeartbeatTimeout..... PASSED
[INFO] com.github.yag.ipc.IPCTest.testClientSideHeartbeatTimeout..... PASSED
[INFO] com.github.yag.ipc.IPCTest.testClientSideHeartbeat............ PASSED
[INFO] com.github.yag.ipc.IPCTest.testClientReconnect................ PASSED
[INFO]
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10.952 sec, Time saved: 25.919 sec.

Punner अचूक संगत आउटपुट का उत्पादन करता है, आप रिपोर्ट निर्देशिका से कच्चे लॉग डेटा और मार्कडाउन प्रारूप रिपोर्ट प्राप्त कर सकते हैं:

  ipc git:(develop) ll target/punner-reports
total 104
-rw-r--r--   1 guile  staff    11K Oct 15 23:07 TEST-com.github.yag.ipc.IPCTest.xml
-rw-r--r--   1 guile  staff   298B Oct 15 23:07 com.github.yag.ipc.IPCTest.txt
drwxr-xr-x  12 guile  staff   384B Oct  8 00:50 logs
-rw-r--r--   1 guile  staff    33K Oct 15 23:07 report.md

Punner मेरा निजी प्रोजेक्ट है, मैंने कुछ अन्य प्रोजेक्ट्स जैसे IPC फ्रेमवर्क, फाइन-ग्रेन लॉकिंग, जर्नल सर्विस, वितरित वर्कफ़्लो इंजन आदि के यूनिट टेस्ट चरण को गति देने के लिए Punner लिखा, इसने मेरे वेटिंग टाइम को बहुत बचाया।

Punner अभी तक कुछ उन्नत सुविधा का समर्थन नहीं करता है। मुझे बहुत खुशी है अगर आप इसे आज़मा सकते हैं और मुझे कुछ प्रतिक्रिया दे सकते हैं।


-3

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


-3

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


1
मैं GridGain समाधान बाहर की कोशिश की है और दो प्रमुख समस्याओं पड़ा है। सबसे पहले, आपको ग्रिड ग्रिड को अपने ग्रिड टास्क के क्लासपैथ से बाहर करने के लिए बताना होगा जो कि ग्रिडगैन भी उपयोग करता है, जैसे स्प्रिंग और बहुत सारे अपाचे कॉमन्स सामान। दूसरे, नेटवर्क क्लास लोडिंग, जबकि एक शानदार विचार, उन पुस्तकालयों के लिए काम नहीं करता है जो क्लासपाथ की खोज करना चाहते हैं, जैसे वसंत
ग्राहम ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.