Как написать многопоточные модульные тесты?
Я хотел бы знать, есть ли какие-то модульные модули тестирования, способные легко писать многопоточные тесты?
Я бы предположил что-то вроде:
вызывать специальный тестовый метод по 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) {
}