2010-10-26 102 views
6

我试图通过多线程访问时测试java.util.concurrent.ConcurrentLinkedQueue。下面提到的是我的Junit测试,使用RepeatedTest在两个并发线程中运行。我的问题是:在ConcurrentLinkedQueue上使用RepeatedTest来测试并发性是否正确?源代码在下面提到。Junit测试并发性

感谢

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

回答

-1

你永远无法真正运行测试,以检查并发问题。事实上,在特定的测试机器上(在给定的操作系统上,有一定数量的内核或处理器,或者甚至是同时运行的其他进程)没有问题并不意味着没有问题。

+2

对于非并发问题也是如此。引用'Edsger W. Dijkstra':*测试显示存在,而不是缺少缺陷*。 – whiskeysierra 2010-10-26 18:39:32

+0

@威利,绝对!我认为,并发问题往往难以发现。 – Bruno 2010-10-26 18:42:46

+1

当然你可以为并发问题编写测试。你当然不能编写可以证明没有错误的测试,但是你仍然可以测试是否存在特定的错误。然而,这些测试可能很复杂。 – 2010-10-27 00:34:54