2010-10-26 12 views
6

Ich versuche, java.util.concurrent.ConcurrentLinkedQueue zu testen, wenn über mehrere Threads zugegriffen wird. Im Folgenden wird mein Junit-Test mit RepeatedTest zur Ausführung in zwei gleichzeitigen Threads beschrieben. Meine Fragen sind: Ist es richtig, Wiederholtest zu verwenden, um Parallelität zum Beispiel auf ConcurrentLinkedQueue zu testen? Der Quellcode ist unten erwähnt.Junit zum Testen der Parallelität

Dank

import java.util.concurrent.ConcurrentLinkedQueue; 
import junit.extensions.ActiveTestSuite; 
import junit.extensions.RepeatedTest; 
import junit.extensions.TestSetup; 
import junit.framework.TestCase; 

public class TestNonBlockingConcurrentQueue extends TestCase{ 

private static ConcurrentLinkedQueue clq; 

public void testPut() throws Exception { 
    int messageCounter = 0; 
    for(;messageCounter <10000; messageCounter++){ 
     clq.offer(messageCounter); 
    } 
    assertEquals(clq.size(), messageCounter); 
} 

public void testGet() throws Exception { 
    while(!clq.isEmpty()){ 
     clq.poll(); 
    } 
    assertEquals("Size should be zero", clq.size(), 0); 
} 

public static junit.framework.Test suite() { 
    ActiveTestSuite ats = new ActiveTestSuite(); 

    TestSetup setup = new TestSetup(ats) { 
     protected void setUp() throws Exception { 
      System.out.println("Creating ConcurrentLinkedQueue.."); 
      clq = new ConcurrentLinkedQueue(); 
     } 
     protected void tearDown() throws Exception { 
      clq = null; 
     } 
    }; 
    ats.addTest(new RepeatedTest(new TestNonBlockingConcurrentQueue("testPut"), 2)); 
    ats.addTest(new RepeatedTest(new TestNonBlockingConcurrentQueue("testGet"), 2)); 
    return setup; 

} 

public TestNonBlockingConcurrentQueue(String testName){ 
    super(testName); 
} 

Antwort

-1

Sie können nie wirklich Tests laufen Concurrency Probleme zu überprüfen. Die Tatsache, dass auf einem bestimmten Testgerät (auf einem bestimmten Betriebssystem, mit einer bestimmten Anzahl von Kernen oder Prozessoren oder auch nur anderen Prozessen, die zur selben Zeit ausgeführt werden) kein Problem auftritt, bedeutet nicht, dass es kein Problem gibt.

+2

Dies gilt auch für Nicht-Parallelitätsprobleme. Um 'Edsger W. Dijkstra' zu zitieren: * Testing zeigt die Anwesenheit, nicht die Abwesenheit von Fehlern. *. – whiskeysierra

+0

@Willi, absolut! Es ist nur so, dass Nebenläufigkeitsprobleme schwerer zu erkennen sind, denke ich. – Bruno

+1

Natürlich können Sie Tests für Concurrency-Probleme schreiben. Sie können sicherlich keine Tests schreiben, die die Abwesenheit von Fehlern beweisen, aber Sie können immer noch auf das Vorhandensein bestimmter Fehler testen. Diese Tests können jedoch schwierig zu schreiben sein. –