I'm trying to test java.util.concurrent.ConcurrentLinkedQueue when accessed via multiple threads. Mentioned below is my Junit test using RepeatedTest to run in two concurrent threads. My questions is: is it correct to use RepeatedTest to test concurrency for example on ConcurrentLinkedQueue? The source code is mentioned below.
Thanks
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 TestNonBlockingC开发者_JS百科oncurrentQueue(String testName){
super(testName);
}
JUnitPerf uses RepeatedTest to test concurrent code so it seems reasonable to use it to do the same thing with your test above, see:
http://www.clarkware.com/software/JUnitPerf.html
There are other methods for unit testing concurrent code, although none of them can really verify that your code is thread safe:
- Concurrent Runner
- ConcJunit
Also see: Unit Testing Concurrent Code
You can never really run tests to check concurrency problems. The fact that no problem shows up on a particular test machine (on a given OS, with a certain number of cores or processors, or even just other processes running at the same time) doesn't mean that there isn't a problem.
精彩评论