Java Junit测试并发性

Java Junit测试并发性,java,concurrency,junit,Java,Concurrency,Junit,我试图在通过多个线程访问时测试java.util.concurrent.ConcurrentLinkedQueue。下面提到的是我的Junit测试,它使用RepeatedTest在两个并发线程中运行。我的问题是:例如在ConcurrentLinkedQueue上使用RepeatedTest测试并发性是否正确?下面提到了源代码 谢谢 import java.util.concurrent.ConcurrentLinkedQueue; import junit.extensions.ActiveTe

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

谢谢

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);
}
import java.util.concurrent.ConcurrentLinkedQueue;
导入junit.extensions.ActiveTestSuite;
导入junit.extensions.RepeatedTest;
导入junit.extensions.TestSetup;
导入junit.framework.TestCase;
公共类TestNonBlockingConcurrentQueue扩展了TestCase{
私有静态ConcurrentLinkedQueue clq;
public void testPut()引发异常{
int messageCounter=0;

对于(;messageCounterJUnitPerf使用RepeatedTest来测试并发代码,因此使用它对上面的测试执行相同的操作似乎是合理的,请参阅:

还有其他方法可以对并发代码进行单元测试,但没有一种方法可以真正验证您的代码是线程安全的:


另请参见:

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

对于非并发问题也是如此。引用Edsger W.Dijkstra的话:测试表明存在错误,而不是没有错误。@Willi,绝对是!我认为,只是并发问题往往更难检测。当然,你可以为并发问题编写测试。你当然不能编写测试测试可以证明没有bug,但是您仍然可以测试特定bug的存在。但是,这些测试编写起来可能很复杂。