2016-01-07 8 views
9

हमारे निर्माण समय को प्रबंधित/कम करने के लिए, मैं यह जानना चाहता हूं कि कौन से यूनिट परीक्षण सबसे अधिक समय ले रहे हैं - maven-surefire-plugin का उपयोग करते हुए समांतर परीक्षण वातावरण में।समानांतर मोड में maven-surefire-plugin का उपयोग करते समय धीमी इकाई परीक्षणों की पहचान कैसे करें?

हम यूनिट परीक्षणों के लिए JUnit (4.10) का उपयोग कर रहे हैं। हम maven (2.2.1 का उपयोग करते हैं - हमारे द्वारा उपयोग किए जाने वाले कुछ प्लगइन्स अभी तक मैवेन का समर्थन नहीं करते हैं 3) हमारे प्राथमिक निर्माण उपकरण के रूप में, और maven-surefire-plugin (2.19) यूनिट परीक्षण चलाने के लिए।

हम प्रयोग कर रहे हैं parallel mode, जहां दोनों अलग-अलग तरीकों समानांतर में चलाए जा रहे हैं समानांतर और इकाई परीक्षण कक्षाओं में चलाए जा रहे हैं में maven-surefire-plugin - यह बहुत महत्वपूर्ण है, के रूप में यह काफी इकाई परीक्षण समय का निर्माण कम कर देता है। maven-surefire-plugin.pom में कॉन्फ़िगर किया गया है इस प्रकार है:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.19</version> 
    <configuration> 
     <argLine>-Xmx2G -XX:MaxPermSize=1G -XX:-UseSplitVerifier</argLine> 
     <failIfNoTests>false</failIfNoTests> 
     <parallel>classesAndMethods</parallel> 
     <useUnlimitedThreads>true</useUnlimitedThreads> 
    </configuration> 
    </plugin> 

हालांकि, इस के निहितार्थ यह है कि सांत्वना उत्पादन में, समय प्रत्येक JUnit परीक्षण वर्ग के लिए गुजरे है में सभी तरीकों के लिए कुल समय है कक्षा।

उदाहरण के लिए, यदि एक परीक्षण कक्षा 10 इकाई परीक्षण तरीकों, जिनमें से प्रत्येक ले लिया चलाने के लिए 1 सेकंड था, तो परीक्षण वर्ग के बारे में 1 सेकंड चलाने के लिए (प्रत्येक विधि समानांतर में चलाया जा रहा) ले जाएगा, लेकिन उत्पादन होगा कुछ हो जैसे:

com.package.QuickParallelTest रनिंग की गई जांच: 10, विफलताओं: 0, त्रुटियाँ: 0, छोड़ा: 0, बीता समय: 10.0 सेकंड - com.package.QuickParallelTest

में

इससे कंसोल आउटपुट में 10 यूनिट परीक्षण विधियों के साथ एक अन्य टेस्ट क्लास में अंतर करना मुश्किल हो जाता है, wh आईआईसी 9 लगभग तुरंत चलती है और 1 को चलाने के लिए लगभग 10 सेकंड लगते हैं। इस मामले में, परीक्षण वर्ग (एक धीमी गति से परीक्षा पद्धति की वजह से) को चलाने के लिए के बारे में 10 सेकंड का समय होगा, लेकिन maven-surefire-plugin सांत्वना उत्पादन प्रभावी ढंग से ही होगा:

com.package.SlowParallelTest रनिंग चलाने टेस्ट: 10, विफलताओं: 0, त्रुटियाँ: 0, छोड़ा: 0, बीता समय: 10.0 सेकंड - com.package.SlowParallelTest में

आदर्श रूप में, मैं चाहूँगा समय इंगित करने के लिए कितनी देर तक परीक्षण वर्ग के लिए ले लिया गुजरे रन (समानांतर में), विधियों को अलग से चलाने के लिए कुल समय नहीं लिया जाता है (जैसे एकल-थ्रेडेड)।

तो, मेरे सवाल (रों) है/हैं:

  1. वहाँ Maven-अचूक-प्लगइन सेटिंग है कि मैं, याद आ रही है, ताकि प्रिंट सारांश तरीकों के लिए कुल के बजाय प्रति कक्षा लिया समय दिखाना चाहते है ?
  2. क्या यह maven-surefire-plugin में ज्ञात "बग" (या "सुविधा") है? (मैंने SureFire JIRA की जांच की है, लेकिन इस तरह कुछ भी नहीं मिला।)
  3. क्या मेरे पास यह जानने का एक वैकल्पिक तरीका है कि कौन से परीक्षण लंबे समय से ले रहे हैं और इसलिए अनुकूलन के लिए प्रमुख हैं।

संपादित करें:

मैं कुछ अतिरिक्त विन्यास सेटिंग्स के साथ खेलने की कोशिश की है।उत्सुकता से, .pom में कॉन्फ़िगरेशन में निम्न को जोड़ने से कंसोल आउटपुट में समय बीतने के लिए टेस्ट क्लास चलाने में समय लगता है - हालांकि, यह (मेरे दिमाग में) काउंटर-अंतर्ज्ञानी है, क्योंकि ये सेटिंग्स हैं default settings:

<configuration> 
     ... 
     <forkCount>1</forkCount> 
     <reuseForks>true</reuseForks> 
    </configuration> 
+0

भविष्य के पाठकों के लिए एक टिप्पणी के रूप में - एक संदर्भ संदर्भ में, कॉन्फ़िगरेशन सेटिंग false सहित, जिसका मतलब है कि कंसोल पर कोई प्रदर्शन डेटा मुद्रित नहीं होता है, बिल्ड समय को बेहतर बना सकता है - फिर आप टिप्पणी कर सकते हैं बिल्डिंग प्रदर्शन प्रोफाइलिंग करते समय सेटिंग। – amaidment

उत्तर

10

Maven अचूक प्लगइन विन्यास को reportFormat प्रविष्टि जोड़ना और (डिफ़ॉल्ट brief के बजाय) plain लिए अपने मूल्य स्थापित करने देना होगा आप विधि के अनुसार समय बीत। डिफ़ॉल्ट reportFormat (brief) के साथ

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.19</version> 
      <configuration> 
       <argLine>-Xmx2G -XX:MaxPermSize=1G -XX:-UseSplitVerifier</argLine> 
       <failIfNoTests>false</failIfNoTests> 
       <parallel>classesAndMethods</parallel> 
       <useUnlimitedThreads>true</useUnlimitedThreads> 
       <reportFormat>plain</reportFormat> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

आउटपुट:

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running com.sample.mocking.InternalServiceTestCase 
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.241 sec - in com.sample.mocking.InternalServiceTestCase 

साथ आउटपुट plain मूल्य:

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running com.sample.mocking.InternalServiceTestCase 
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.187 sec - in com.sample.mocking.InternalServiceTestCase 
test(com.sample.mocking.InternalServiceTestCase) Time elapsed: 0.005 sec 
mockTest(com.sample.mocking.InternalServiceTestCase) Time elapsed: 0.17 sec 
mockTestFailureTollerance(com.sample.mocking.InternalServiceTestCase) Time elapsed: 0.007 sec 
mockProcessfile(com.sample.mocking.InternalServiceTestCase) Time elapsed: 0.003 sec 

यह विकल्प आपको परीक्षण और निष्पादन समय पर अधिक जानकारी दे सकते हैं।

+0

धन्यवाद - यह बहुत उपयोगी है। मैंने उस सेटिंग को देखा था, लेकिन दस्तावेज के बाद से इसे छूट दिया (जैसा कि आप लिंक करते हैं) कहता है कि यह "आउटपुट फाइलों के आउटपुट प्रारूप पर ही लागू होता है"। इस परीक्षण का उपयोग इकाई परीक्षण बाधाओं की पहचान करने में सहायक रहा है। यह एक पैनसिया नहीं है, हालांकि, ऐसा लगता है कि निश्चित प्लगइन निष्पादन के लिए भेजे जाने के बजाए निष्पादन के लिए भेजे जाने पर प्रत्येक विधि पर घड़ी शुरू करता है। (मैं गलत हो सकता हूं, लेकिन यह उस समय की मेरी व्याख्या है जिसे मैं देख रहा हूं।) – amaidment

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