2010-10-26 22 views
6

Estoy tratando de probar java.util.concurrent.ConcurrentLinkedQueue cuando se accede a través de varios hilos. A continuación se menciona mi prueba de Junit con RepeatedTest para ejecutar en dos subprocesos concurrentes. Mi pregunta es: ¿es correcto usar RepeatedTest para probar la concurrencia, por ejemplo, en ConcurrentLinkedQueue? El código fuente se menciona a continuación.Junit para probar la concurrencia

Gracias

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); 
} 

Respuesta

-1

Nunca se puede ejecutar para comprobar problemas de concurrencia. El hecho de que no aparezca ningún problema en una máquina de prueba en particular (en un sistema operativo determinado, con un cierto número de núcleos o procesadores, o incluso solo otros procesos que se ejecutan al mismo tiempo) no significa que no haya un problema.

+2

Esto también es válido para problemas de falta de concurrencia. Para citar 'Edsger W. Dijkstra': * Las pruebas muestran la presencia, no la ausencia de errores. *. – whiskeysierra

+0

@Willi, ¡absolutamente! Es solo que los problemas de concurrencia tienden a ser más difíciles de detectar, creo. – Bruno

+1

Por supuesto, puede escribir pruebas para problemas de concurrencia. Ciertamente no puede escribir pruebas que sean prueba de la ausencia de errores, pero aún puede probar la presencia de errores específicos. Sin embargo, estas pruebas pueden ser complicadas de escribir. –