如何编写测试并发不变量的单元测试

时间:2012-01-31 22:06:26

标签: java unit-testing

关于这个问题还有其他问题,但我正试图想办法如何处理这样的单元测试:

 public class Semaphore extends Lock {
        private AtomicInteger semaphore = new AtomicInteger(0);
        public synchronized boolean available() {
                return semaphore.intValue() == 0;
        }
        public synchronized void acquire() {
            semaphore.incrementAndGet();

        }
        public synchronized void release() {
            semaphore.decrementAndGet();
        }
    }

这是我的家庭锁定机制(仅用于学习目的)。我该如何测试这个线程的安全性?我知道在单元测试并发代码方面没有任何保证,但是我怎样才能编写ATTEMPTS来测试这种锁定机制中固有的不变量的单元测试呢?

1 个答案:

答案 0 :(得分:6)

我想我会回答自己的问题,因为我做了一些研究。这是一个名为MultithreadedTC的伟大框架。它允许您设置如下测试:

public class SafeSemaphoreTest extends MultithreadedTestCase {

    private SafeSemaphore semaphore;
    AtomicInteger ai = new AtomicInteger(0);

    @Override
    public void initialize() {
        semaphore = new SafeSemaphore();
    }


    public void thread1() throws InterruptedException {

        assertTick(0);

        semaphore.acquire();
        waitForTick(2);
        assertTick(2);

        semaphore.acquire();
        assertEquals(semaphore.getValue(), 2);
        assertEquals(semaphore.getValue()==3, false);
        semaphore.release();
        semaphore.release();

    }

    public void thread2() throws InterruptedException {
        waitForTick(1);
        assertTick(1);
        assertEquals(semaphore.available(), false);
        waitForTick(3);
        assertTick(3);
        assertEquals(semaphore.available(), true);

    }

}

其中waitForTick(int)调用生成当前Thread块直到达到tick。为了更好的JUnit集成,甚至还有一些开发使它更现代化: http://janvanbesien.blogspot.com/2009/06/modernizing-multithreadedtc-junit-4.html