2013-06-10 6 views
9

मेरे पास कुछ परीक्षण मामले हैं जो जुनीट मुझे 10000ms में समय बता रहा है जब पूरा परीक्षण केवल कुछ सेकंड तक चलता है। यहाँ उत्पादन है:जुनीट टेस्ट "टाइम्स आउट" जल्दी से निष्पादन के बावजूद?

Tests run: 3, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 2.528 sec <<< FAILURE! 
closeTest1(com.w2ogroup.analytics.sibyl.transport.impl.http.server.HttpServerTransportTests) Time elapsed: 1.654 sec <<< ERROR! 
java.lang.Exception: test timed out after 10000 milliseconds 

closeTest2(com.w2ogroup.analytics.sibyl.transport.impl.http.server.HttpServerTransportTests) Time elapsed: 0.672 sec <<< ERROR! 
java.lang.Exception: test timed out after 50000 milliseconds 


Results : 

Tests in error: 
    HttpServerTransportTests » test timed out after 10000 milliseconds 
    HttpServerTransportTests » test timed out after 50000 milliseconds 

Tests run: 3, Failures: 0, Errors: 2, Skipped: 0 

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 4.383s 
[INFO] Finished at: Sun Jun 09 19:00:09 PDT 2013 
[INFO] Final Memory: 9M/129M 
[INFO] ------------------------------------------------------------------------ 

यह संभावना नहीं लगता है कि मेरी परीक्षण 10 से अधिक (या 50) सेकंड ले रही है जब पूरे परीक्षण चालन केवल 4.3s चली चलाने के लिए द्वारा समय समाप्त हो गया है।

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>${maven-surefire-plugin.version}</version> 
    <configuration> 
    <!-- 
     We always want to exclude provided deps. I'm not sure why this 
     isn't the default. 
    --> 
    <classpathDependencyScopeExclude>provided</classpathDependencyScopeExclude> 
    <includes> 
     <include>**/*Tests.*</include> 
    </includes> 
    </configuration> 
</plugin> 

किसी को भी इस क्यों हो रहा हो सकता के बारे में कोई विचार है: :)

यहाँ अचूक विन्यास पोम से मैं परीक्षण चलाने के लिए उपयोग कर रहा हूँ है?

EDIT: नीचे अनुरोध के अनुसार यहां कुछ और जानकारी दी गई है।

यहां परीक्षणों में से एक का आउटपुट है। मैं एक साधारण परिवहन तंत्र का निर्माण कर रहा हूं, इसलिए मैं यूनिट परीक्षणों का निर्माण कर रहा हूं जो नजदीकी धाराएं और एनआईओ धागे को बाधित करने के लिए बाधित करती हैं, यही कारण है कि उन सभी (अपेक्षित) आईओ-प्रकार Exception एस हैं।

Running com.siggroup.analytics.sibyl.transport.impl.http.server.HttpServerTransportTests 
2013-06-10 08:32:53.195:INFO:oejs.Server:Thread-0: jetty-9.0.3.v20130506 
Jun 10, 2013 8:32:53 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate 
INFO: Initiating Jersey application, version 'Jersey: 1.17.1 02/28/2013 12:47 PM' 
2013-06-10 08:32:53.925:INFO:oejsh.ContextHandler:Thread-0: Started [email protected]{/,null,AVAILABLE} 
2013-06-10 08:32:54.136:INFO:oejs.ServerConnector:Thread-0: Started [email protected]{HTTP/1.1}{0.0.0.0:8080} 
org.eclipse.jetty.server.HttpConnection$Input$1: [email protected]{/127.0.0.1:58667<r-l>/127.0.0.1:8080,o=true,is=false,os=false,[email protected]$ 
EOF 
     at org.eclipse.jetty.server.HttpConnection$Input.blockForContent(HttpConnection.java:588) 
     at org.eclipse.jetty.server.HttpInput.read(HttpInput.java:130) 
     at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) 
     at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) 
     at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) 
     at sun.nio.cs.StreamDecoder.read0(StreamDecoder.java:126) 
     at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:112) 
     at java.io.InputStreamReader.read(InputStreamReader.java:168) 
     at com.siggroup.analytics.sibyl.transport.impl.http.server.WorkerTrackingDelegatingReader$2.work(WorkerTrackingDelegatingReader.java:64) 
     at com.siggroup.analytics.sibyl.transport.impl.http.server.WorkerTrackingDelegatingReader$2.work(WorkerTrackingDelegatingReader.java:1) 
     at com.siggroup.analytics.commons.concurrent.Scope.work(Scope.java:49) 
     at com.siggroup.analytics.sibyl.transport.impl.http.server.WorkerTrackingDelegatingReader.read(WorkerTrackingDelegatingReader.java:60) 
     at java.io.FilterReader.read(FilterReader.java:65) 
     at java.io.PushbackReader.read(PushbackReader.java:90) 
     at com.siggroup.sibyl.transport.impl.readerwriter.ReaderWriterTransportReaderThread.readPacket(ReaderWriterTransportReaderThread.java:32) 
     at com.siggroup.sibyl.transport.impl.queued.QueuedTransportReaderThread.run(QueuedTransportReaderThread.java:21) 
Caused by: java.lang.InterruptedException 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:996) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1303) 
     at java.util.concurrent.Semaphore.acquire(Semaphore.java:317) 
     at org.eclipse.jetty.util.BlockingCallback.block(BlockingCallback.java:96) 
     at org.eclipse.jetty.server.HttpConnection$Input.blockForContent(HttpConnection.java:559) 
     ... 15 more 
2013-06-10 08:32:54.958:WARN:oejs.HttpConnection:qtp557611759-26: [email protected]{FILLING_BLOCKED},g=HttpGenerator{s=END},p=HttpParser{s=CHUNKED_CONTENT,1 of$ 
java.lang.IllegalStateException: Already Blocked 
     at org.eclipse.jetty.io.AbstractConnection.block(AbstractConnection.java:233) 
     at org.eclipse.jetty.server.HttpConnection.access$400(HttpConnection.java:50) 
     at org.eclipse.jetty.server.HttpConnection$Input.blockForContent(HttpConnection.java:557) 
     at org.eclipse.jetty.server.HttpInput.consumeAll(HttpInput.java:282) 
     at org.eclipse.jetty.server.HttpConnection.completed(HttpConnection.java:460) 
     at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333) 
     at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:225) 
     at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358) 
     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:596) 
     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:527) 
     at java.lang.Thread.run(Thread.java:722) 
java.io.EOFException 
     at com.siggroup.sibyl.transport.impl.readerwriter.ReaderWriterTransportReaderThread.readPacket(ReaderWriterTransportReaderThread.java:36) 
     at com.siggroup.sibyl.transport.impl.queued.QueuedTransportReaderThread.run(QueuedTransportReaderThread.java:21) 

परीक्षण @Test(timeout=/* number */) के साथ चलाए जाते हैं।

@Test(timeout = 10000) 
public void closeTest1() throws IOException, InterruptedException { 
    /* Test goes here */ 
} 

संपादित:, भावी पीढ़ी के लिए @ MatthewFarwell का जवाब नीचे है: यहाँ परीक्षण मामलों में से एक के हस्ताक्षर है

------------------------------------------------------------------------------- 
Test set: com.w2ogroup.analytics.sibyl.transport.impl.http.server.HttpServerTransportTests 
------------------------------------------------------------------------------- 
Tests run: 3, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 3.136 sec <<< FAILURE! 
closeTest1(com.w2ogroup.analytics.sibyl.transport.impl.http.server.HttpServerTransportTests) Time elapsed: 2.218 sec <<< ERROR! 
java.lang.Exception: test timed out after 10000 milliseconds 

closeTest2(com.w2ogroup.analytics.sibyl.transport.impl.http.server.HttpServerTransportTests) Time elapsed: 0.661 sec <<< ERROR! 
java.lang.Exception: test timed out after 50000 milliseconds 

संपादित: यहाँ अचूक लॉग की सारी सामग्री है संकेत के रूप में सही है। मैंने पाया कि जुनीट 4.12-स्नैपशॉट मेवेन सेंट्रल में उपलब्ध नहीं था, इसलिए अधिक भंडार स्थापित करने और स्नैपशॉट आर्टिफैक्ट पर निर्भरता रखने के बजाय, मैंने /catch में InterruptedException एस के लिए अपना टेस्ट केस लपेट लिया, जिसने टेस्ट केस रखा InterruptedException का प्रचार करने से, जिसने समस्या को हल किया।

+0

हमें स्टैकट्रैक दिखाएं ... –

+0

@StephenC ने प्रश्न को अद्यतन किया। – sigpwned

+0

दिलचस्प ... लेकिन मेरा मतलब स्टैकट्रैक था जिसमें 'java.lang.Exception' शामिल है। यह निश्चित रिपोर्ट में होना चाहिए। –

उत्तर

6

यह जुनीट के साथ एक मुद्दा है। वास्तव में, 'परीक्षण का समय समाप्त हो' संदेश प्रदर्शित होता है या है वहाँ एक InterruptedException:

public class FooTest { 
    @Test(timeout = 10000) 
    public void timeoutTest() throws Exception { 
    throw new InterruptedException("hello"); 
    } 
} 

परिणामों में:

java.lang.Exception: test timed out after 10000 milliseconds 

जो कम से कम कहने के लिए भ्रामक है। यह तब भी होता है जब आप Timeout Rule का उपयोग करते हैं। तो, अपने उदाहरण में, आप एक InterruptedException

Caused by: java.lang.InterruptedException 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:996) 
    ... 

फेंक रहे हैं और यह गलत समय समाप्त अपवाद उत्पन्न कर रहा है।

यह 4.11 (और पिछले) में एक बग है, लेकिन इसे सही ढंग से 4.12-स्नैपशॉट में काम करता है, यह पैदा करता है:

java.lang.InterruptedException: hello 
    at xxx.xxx.xxx.FooTest.timeoutTest(FooTest.java:13) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    ... 

तो, मैं बाहर 4.12-SNAPSHOT की कोशिश करेंगे, और कहा कि अगर काम करता है, आप या तो इसका उपयोग जारी रख सकते हैं (अपनी निजी प्रतिलिपि के साथ), या अपने कोड में नए Timeout नियम & FailOnTimeout कक्षा की प्रतिलिपि बना सकते हैं।

फिर, जब 4.12 बाहर आता है, तो आप वापस कर सकते हैं। कोई विचार नहीं जब वह बीटीडब्ल्यू होगा।

+0

+1। सराहनीय लगता है। मैं उस रात का परीक्षण करूंगा। – sigpwned

1

जुनीट एक परीक्षण का पता लगाता है जो catching a TimeoutException द्वारा समाप्त हो गया है। यह आम तौर पर पर shutdownNow पर परीक्षण परीक्षण फ्रेमवर्क के कारण होगा जो परीक्षण चला रहा है।

क्या यह संभव है कि आपके असफल परीक्षणों में से एक इस अपवाद को फेंक रहा है, और जुनीट इसे परीक्षण समय समाप्ति के रूप में रिपोर्ट कर रहा है?

+0

यह अच्छी जानकारी है। +1। मेरा कोड निश्चित रूप से 'टाइमआउट अपवाद' नहीं फेंकता है, और मुझे नहीं लगता कि मेरा परीक्षण भी है। मैं स्ट्रीम बंद कर रहा हूं और एनआईओ धागे को बाधित कर रहा हूं, हालांकि; क्या आप किसी भी कारण से अवगत हैं कि वे 'टाइमआउट अपवाद' क्यों फेंकेंगे? मैं इस परिकल्पना का परीक्षण करने के लिए अपने परीक्षणों को 'try'/'catch' में लपेटूंगा। – sigpwned

+0

'टाइमआउट एक्सेप्शन' का उपयोग 'एक्जिक्यूटर्स सर्विस' द्वारा किया जाता है, जो [भारी उपयोग किया जाता है] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/class-use/ExecutorService.html) 'nio' कक्षाओं द्वारा। तो मुझे लगता है कि आंतरिक रूप से 'nio' कक्षाएं टाइमआउट अपवाद को ट्रिगर कर रही हैं। – Subhas

1

क्या आपके पास टेस्ट परीक्षणों के लिए निर्धारित समय-समय पर कोई बदलाव आया है?

@Test (timeout=10000) 

या

@Rule 
    public Timeout globalTimeout= new Timeout(10); 
+0

अच्छा सवाल। मैं '@ टेस्ट (टाइमआउट = 10000)' का उपयोग कर रहा हूं। मैंने सवाल अपडेट कर लिया है। – sigpwned

0

यह कनेक्शन की तरह दिखता है लटका हुआ है

org.eclipse.jetty.server.HttpConnection$Input.blockForContent(HttpConnection.java:588) 

और परीक्षण नहीं है वास्तव में सेकंड के एक जोड़े के बाद समाप्त होता है।

HttpConnection त्रुटि पर ध्यान केंद्रित कर प्रयास करें (या आप और सहायता चाहिए तो अपने कोड जोड़ने)

इस समस्या के लिए उदाहरण देखें:

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