2013-02-15 39 views
12

परीक्षण निष्पादन समय जो eclipse-> JUnit-व्यू में प्रदर्शित होता है पूरे परीक्षण का मामला निष्पादन जिसमें शामिल है पर निर्भर करता है मुझे अपने व्यवसाय के निष्पादन समय और केवल मेरे व्यवसायिक के बारे में अधिक विस्तृत बयान चाहिए। है यही कारण है कि मैं अपने testcase अंदर किया है:व्यापार के निष्पादन समय को मेरे जूनिट के प्रासंगिक कोड को निर्धारित करने का सबसे अच्छा अभ्यास क्या है?</p> <ul> <li>Testdata preperation</li> <li>businesslogic</li> <li>ज़ोर परिणाम</li> </ul> <p>निष्पादित:

Date lNow = new Date(); 
List<Geo> lAllBasisGeo = mGeoEvaluator.evaluateAllGeo(lGeoFixture.getGeo(), lAllGeo); 
Date lStop = new Date(); 
System.out.println("Time of execution in seconds:"+((lStop.getTime()-lNow.getTime())/1000)); 

खैर ... मुझे लगता है कि मैं एक बहुत ही अजीब तरह से समय निर्धारित करते हैं। इसके अलावा मुझे नहीं लगता कि दो दिनांक चर घोषित करना आवश्यक है।

मुझे सलाह की जरूरत और अधिक कुशलता से कि कोड लिखने ...

+0

System.currentTimeMillis या System.nanoTime पर एक नजर डालें। तिथि के साथ चक्कर लगाने की जरूरत नहीं है। – kutschkem

उत्तर

21

लिखने के लिए मैं एक JUnit 4 टिप्पणी के साथ टेस्ट करने के लिए एक समय समाप्ति को जोड़ने के लिए, यह निर्धारित करने के परीक्षण में सफ़ल (काफी तेजी से) या नहीं पसंद करेंगे अनुमति होगी:

@Test(timeout=100)//let the test fail after 100 MilliSeconds 
public void infinity() { 
    while(true); 
} 

अपने व्यापार तर्क का सही क्रम निर्धारित करने के लिए मैं, सही से पहले और अपने महत्वपूर्ण Codepath के बाद जैसे तुमने किया था समय बयान जोड़ने इसे कई बार पढ़ाई में सही परिणाम प्राप्त करने के दोहराए जाते हैं, और बयानों को फिर से हटा, तो कोड पतला करो।

long start = System.currentTimeMillis(); 
//execute logic in between 
long end = System.currentTimeMillis(); 
System.out.println("DEBUG: Logic A took " + (end - start) + " MilliSeconds"); 
9

वहाँ अमरूद पुस्तकालय में इस के लिए एक बहुत उपयोगी सुविधा मौजूद है - Stopwatch
यह आपको एक इकाई परीक्षण में निम्नलिखित

final Stopwatch stopwatch = new Stopwatch().start(); 
//dostuff 
System.out.println("Time of execution in seconds:" + stopwatch.stop().elapsed(TimeUnit.SECONDS)); 
+2

दुर्भाग्य से मुझे तीसरे पक्ष के पुस्तकालयों का उपयोग करने की परमिट नहीं है। –

19

JUnit 4.12 Stopwatch@Rule की शुरुआत की। यह परीक्षण के दौरान खर्च किए गए समय की पुष्टि करने के लिए डी फैक्टो बनने का तरीका बनने के लिए काफी कठोर है। यहां एक नमूना वर्ग अपनी कार्यक्षमताओं प्रदर्शन है:

public static class StopwatchTest { 
    private static final Logger logger = Logger.getLogger(""); 

    private static void logInfo(Description description, String status, long nanos) { 
     String testName = description.getMethodName(); 
     logger.info(String.format("Test %s %s, spent %d microseconds", 
            testName, status, TimeUnit.NANOSECONDS.toMicros(nanos))); 
    } 

    @Rule 
    public Stopwatch stopwatch = new Stopwatch() { 
     @Override 
     protected void succeeded(long nanos, Description description) { 
      logInfo(description, "succeeded", nanos); 
     } 

     @Override 
     protected void failed(long nanos, Throwable e, Description description) { 
      logInfo(description, "failed", nanos); 
     } 

     @Override 
     protected void skipped(long nanos, AssumptionViolatedException e, Description description) { 
      logInfo(description, "skipped", nanos); 
     } 

     @Override 
     protected void finished(long nanos, Description description) { 
      logInfo(description, "finished", nanos); 
     } 
    }; 

    @Test 
    public void succeeds() { 
    } 

    @Test 
    public void fails() { 
     fail(); 
    } 

    @Test 
    public void skips() { 
     assumeTrue(false); 
    } 

    @Test 
    public void performanceTest() throws InterruptedException { 
     // An example to assert runtime: 
     long delta = 30; 
     Thread.sleep(300L); 
     assertEquals(300d, stopwatch.runtime(MILLISECONDS), delta); 
     Thread.sleep(500L); 
     assertEquals(800d, stopwatch.runtime(MILLISECONDS), delta); 
    } 
} 
+0

बहुत बढ़िया! इसके लिए धन्यवाद। –

+0

बहुत बढ़िया टिप। वास्तव में सहायक एक सवाल। ऐसा लगता है कि सेटअप और टियरडाउन विधियों द्वारा भी लिया गया समय रिकॉर्ड किया जा रहा है (पहले और बाद में और शायद पहले क्लास और आफ्टर क्लास भी)। मैं केवल परीक्षण विधि द्वारा उठाए गए समय को कैसे माप सकता हूं? –

+1

@AndyDufresne दुर्भाग्यवश, मुझे नहीं लगता कि आप केवल नियम का उपयोग करके परीक्षण विधि को माप सकते हैं। ऐसा इसलिए होता है क्योंकि जुनीट के नियम @ तंत्र ने नियमों को इस तरह के भेदभाव की अनुमति नहीं दी है (वे पहले से ही @ @ के अस्तित्व से अनजान हैं)। मेरा सुझाव है कि आप सभी befores (कक्षा के अंत में एक स्थान पर रखें, क्योंकि इसे अंतिम रूप से निष्पादित किया जाना चाहिए) के बाद एक क्षेत्र में 'स्टॉपवॉच। रनटाइम (मिलीबिसेन्ड्स)' रिकॉर्ड करें और फिर इसे मापा समय से घटाएं। (यदि आपके पास '@ आफ्टर' है, तो इसकी गणना की जानी चाहिए।) – acdcjunior

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

  • कोई संबंधित समस्या नहीं^_^