Как написать многопоточные модульные тесты?

Я хотел бы знать, есть ли какие-то модульные модули тестирования, способные легко писать многопоточные тесты?

Я бы предположил что-то вроде: вызывать специальный тестовый метод по n потокам одновременно в течение нескольких раз. После завершения всех тестовых потоков будет вызываться метод утверждения, в котором должны быть проверены некоторые ограничения.

Мой текущий подход заключается в создании объектов Thread внутри метода тестирования junit, циклических вручную реальных тестовых сценариев внутри каждого метода run(), ожидания всех потоков и последующего подтверждения утверждений. Но, используя это, у меня есть большой код шаблона кода для каждого теста.

Каковы ваши впечатления?

Ответы

Ответ 1

Существует ConTest, а также GroboUtils.

Я использовал GroboUtils много лет назад, и это сработало. ConTest новее и станет для меня предпочтительной отправной точкой, так как вместо того, чтобы просто полагаться на пробную версию и ошибку, измерительная аппаратура усиливает определенные перемежения потоков, обеспечивая детерминированный тест. Напротив, GroboUtils MultiThreadedTestRunner просто запускает тесты и надеется, что планировщик производит чередование, которое вызывает появление ошибки потока.

EDIT: см. также ConcuTest, который также заставляет перемежения и свободен.

Ответ 2

Существует также MultithreadedTC Билла Пью из славы FindBugs.

Ответ 3

Просто использование библиотек concurrency упростит ваш код. Вы можете превратить ваш код плиты котла в один метод.

Что-то вроде

public static void runAll(int times, Runnable... tests) {

}