Junit to test concurrency
concurrency, java, junit
Solution
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
Problem
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 TestNonBlockingConcurrentQueue(String testName){ super(testName); } ```