Как добавить тесты для многопоточной поддержки? - PullRequest
7 голосов
/ 21 октября 2008

У меня есть сервис Java, который теперь будет выполняться в пакетном режиме. В службу добавлена ​​многопоточная поддержка, поэтому для каждого пакетного запроса будет выделен пул потоков для выполнения пакета. Вопрос в том, как это проверить? У меня есть функциональные тесты, которые проходят под многопоточной версией сервиса, но, так или иначе, я чувствую, что должна быть идиома для тестирования этого.

Ответы [ 4 ]

6 голосов
/ 21 октября 2008

Не существует "хорошего" способа сделать это. Лучшее, что я могу предложить, это TestNG, который позволяет аннотировать ваши методы тестирования и одновременно запускать их в потоках n . Например:

@Test(invocationCount=10, threadPool=10)
public void testSomethingConcurrently() {
    ...
}

Мои знания TestNG в лучшем случае ржавые, но AFAIK, который должен вызывать метод testSomethingConcurrently одновременно 10 раз. Это хороший и декларативный способ запуска многопоточных тестов для вашего кода.

Конечно, вы можете сделать что-то подобное в JUnit, порождая потоки вручную в цикле, но с этим безумно уродливо и трудно работать. Я должен был сделать это один раз для проекта, над которым я работал; эти испытания были кошмаром, поскольку их неудачи не всегда повторялись.

Тестирование на параллелизм является сложным и подверженным фрустрации из-за его недетерминированной природы. Это одна из причин того, почему в наши дни наблюдается такой сильный стимул использовать лучшие абстракции параллелизма, которые легче «рассуждать» и убеждать себя в правильности.

1 голос
/ 11 апреля 2013

Я использовал

    @Test(threadPoolSize = 100, invocationCount = 100)
    @DataProvider(parallel = true)

выполнено 100 потоков параллельно 100 раз.

1 голос
/ 21 октября 2008

Обычно вещи, которые ломают многопоточные приложения, являются проблемами синхронизации. Я подозреваю, что для выполнения модульного тестирования в полной многопоточной среде для этого потребуются огромные изменения в кодовой базе.

Тем не менее, вы можете протестировать реализацию пула потоков в отдельности.

Заменив тело потоков тестовым кодом, вы сможете построить свои патологические условия блокировки и использования ресурсов.

Затем выполните модульное тестирование функциональных элементов в однопоточной среде, где вы можете игнорировать временные характеристики.

Хотя это не идеально, это гарантирует повторяемость, что очень важно для вашего модульного тестирования. (как указано в ответе Даниэля Спевака)

0 голосов
/ 21 октября 2008

Я согласен с Дэниелом, тестирование параллелизма действительно очень сложно.

У меня нет решения для параллельного тестирования, но я расскажу вам, что я делаю, когда хочу протестировать код, включающий многопоточность. Большая часть моего тестирования проводится с использованием JUnit и JMock. Поскольку JMock плохо работает с несколькими потоками, я использую расширение JMock, которое предоставляет синхронные версии Executor и ScheduledExecutorService. Это позволяет мне тестировать код, предназначенный для запуска несколькими потоками в одном потоке, где я также могу контролировать поток выполнения. Как я уже говорил, это не проверяет параллелизм. Он только проверяет поведение моего кода однопоточным способом, но уменьшает количество ошибок, возникающих при переключении на многопоточные исполнители.

В любом случае, я рекомендую использовать новый API параллелизма Java. Это делает вещи намного проще.

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