Как написать модульные тесты, которые тестируют инварианты параллелизма - PullRequest
9 голосов
/ 01 февраля 2012

Есть и другие вопросы по этой проблеме, но я пытаюсь понять, как подойти к модульному тестированию примерно так:

 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();
        }
    }

Это мой механизм блокировки домотканого вращения (только для учебных целей). Как бы я проверил безопасность потока этого? Я знаю, что нет никаких гарантий, когда речь идет о модульном тестировании параллельного кода, но как мне вообще написать о модульном тесте, который ПЫТАЕТСЯ протестировать очевидные инварианты, присущие этому механизму блокировки?

1 Ответ

6 голосов
/ 01 февраля 2012

Полагаю, я отвечу на свой вопрос, так как я провел некоторое исследование.Есть замечательный фреймворк под названием 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, пока тик не будет достигнут.Была даже некоторая разработка, чтобы сделать это немного более современным для лучшей интеграции JUnit: http://janvanbesien.blogspot.com/2009/06/modernizing-multithreadedtc-junit-4.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...