2013-06-10 16 views
9

JUnit'in tüm test çalıştırması sadece birkaç saniye sürdüğünde bana 10000ms'de zaman geçirdiğini gösteren birkaç test vakası var. Çıktı İşte: Benim testler bütün test çalıştırması yalnızca 4.3s süren çalıştırılacak 10'dan fazla (veya 50) saniye alarak zaman aşımına uğramış olması pek olası değildirJUnit "Times Out" Testi Hızlı Çalışmaya Devam Ediyor mu?

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

.

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

Herkes neden bu oluyor olabilir bir fikrin var mı: :)

Burada tahlil yapmak kullanıyorum POM'dan SureFire yapılandırma var?

EDIT: Aşağıda, aşağıda belirtildiği gibi bazı daha fazla bilgi bulabilirsiniz.

Testlerden birinin çıktısı burada. Basit bir aktarım mekanizması yapıyorum, bu yüzden akışları kapatan ve NIO iş parçacığını bırakan birim sınamaları yapıyorum, bu yüzden hepsi (beklenen) IO tipi Exception s var.

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) 

testler @Test(timeout=/* number */) ile çalıştırılır.

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

DÜZENLEME: İşte test durumlarda birinin imzası

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

DÜZENLEME: İşte SureFire günlüğüne tüm içeriği olan kuşaklar için, MatthewFarwell cevabı aşağıdadır @ Belirtildiği gibi düzeltin. JUnit 4.12-SNAPSHOT'un Maven Central'da mevcut olmadığını, bu yüzden daha fazla depo kurmak yerine ve bir SNAPSHOT artefaktına sahip olmak yerine, test vakamı InterruptedException s için try/catch s test paketine sardım. Bu sorunu gideren InterruptedException yayılıyor.

+0

Bize yığın sayısını göster ... –

+0

@StephenC soruyu şimdi yanıtladı. – sigpwned

+0

İlginç ... ama ben java.lang.Exception'ı içeren stacktrace'i kastettim. Kesin raporlarda olmalı. –

cevap

6

Bu JUnit ile ilgili bir sorundur. Aslında, 'testi zaman aşımına uğradı' mesajı bir InterruptedException varsa görüntülenir: Az söylemek kafa karıştırıcı

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

: içinde

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

sonuçlanır. Bu, Timeout Rule kullanıyor olsanız bile olur. Yani, örnekte, bir InterruptedException

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

atıyor ve bu yanlış zaman aşımı istisna neden oluyor.

Bu 4,11 (önceki) bir hata, ama 4.12-SNAPSHOT doğru çalışır, ürettiği: Yani

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

, eğer inşaat dışarı 4.12-SNAPSHOT deneyin ve olur, ya kullanmaya devam edebilir (kendi özel kopyanızla) veya yeni Timeout kuralı & FailOnTimeout sınıfını kodunuza kopyalayabilirsiniz.

Ardından, 4.12 çıktığında, geri alabilirsiniz. Ne zaman btw olacak diye bir fikrim yok.

+0

+1. Kulağa mantıklı geliyor. Bunu bu gece test edeceğim. – sigpwned

1

JUnit, catching a TimeoutException tarafından zaman aşımına uğramış bir testi algılar. Bu, normal olarak, testi çalıştıran ExecutorService numaralı telefonda shutdownNow numaralı çağrıyı çağıran test çerçevesinden kaynaklanır.

Başarısız testlerinizden birinin bu istisnayı kendisinin atması mümkün mü ve JUnit bunu bir zaman aşımı olarak mı rapor ediyor?

+0

Bu harika bir bilgi. +1. Kodum kesinlikle bir "TimeoutException" yazmıyor ve testimin de öyle olduğunu sanmıyorum. Yine de, akışları kapatıyorum ve NIO iş parçacığını kesintiye uğratıyorum; Bunların bir "TimeoutException" a neden olmasının herhangi bir nedeninin farkında mısınız? Bu hipotezi test etmek için testlerimi "try"/"catch" a kaydırırım. – sigpwned

+0

'TimeoutException', [çok kullanılan] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/class-use/ExecutorService.html) tarafından kullanılan ExecutorService tarafından kullanılır. niyo sınıfları tarafından. Bu yüzden dahili olarak 'nio' sınıfları TimeoutException'ı tetikliyor. – Subhas

1

Herhangi bir tez sınavında tanımlanan zaman aşımı var mı?

@Test (timeout=10000) 

veya

Bu bağlamda benziyor
@Rule 
    public Timeout globalTimeout= new Timeout(10); 
+0

İyi soru. '@Test (timeout = 10000)' kullanıyorum. Soruyu güncelledim. – sigpwned

İlgili konular