我试图通过多线程访问时测试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);
}
对于非并发问题也是如此。引用'Edsger W. Dijkstra':*测试显示存在,而不是缺少缺陷*。 – whiskeysierra 2010-10-26 18:39:32
@威利,绝对!我认为,并发问题往往难以发现。 – Bruno 2010-10-26 18:42:46
当然你可以为并发问题编写测试。你当然不能编写可以证明没有错误的测试,但是你仍然可以测试是否存在特定的错误。然而,这些测试可能很复杂。 – 2010-10-27 00:34:54