Кто-нибудь получил совет или знает какие-либо рамки для модульного тестирования многопоточных приложений?
Вопрос
Модульное тестирование многопоточных приложений
Ответы
Ответ 1 · рейтинг 2 · Abhijeet Kashnia
Попробуйте многопоточныйTC
Ответ 2 · рейтинг 5 · Boris Pavlović
Не тестируйте многопоточные приложения. Рефакторинг кода для устранения связи между работой, выполняемой в разных потоках. Затем протестируйте его отдельно.
Ответ 3 · рейтинг 2 · Justin
Обычно вы не проводите модульное тестирование параллелизма многопоточных приложений, поскольку модульные тесты ненадежны и не воспроизводимы - из-за характера ошибок параллелизма обычно невозможно написать модульные тесты, которые последовательно либо терпят неудачу, либо успешны, и поэтому модульные тесты параллельного кода обычно не делают очень полезных модульных тестов.
Вместо этого вы выполняете модульное тестирование каждого отдельного многопоточного компонента вашего приложения в обычном режиме и полагаетесь на сеансы нагрузочного тестирования для выявления проблем параллелизма.
Тем не менее, существуют некоторые экспериментальные среды нагрузочного тестирования для тестирования параллельных приложений, такие как Microsoft CHESS - CHESS многократно запускает заданный модульный тест и систематически исследует все возможные чередования параллельного теста. Это делает ваши модульные тесты надежными и воспроизводимыми.
Однако на данный момент CHESS все еще является экспериментальным (и, вероятно, не может использоваться с JVM) - пока придерживайтесь нагрузочного тестирования, чтобы отсеять проблемы параллелизма.
Ответ 4 · рейтинг 2 · Jonathan
В тестировании многопоточного кода нет ничего плохого, особенно если многопоточность - это главная роль тестируемого кода. Общий подход к тестированию многопоточного/асинхронного кода состоит в том, чтобы заблокировать основной тестовый поток, перехватить все ошибочные утверждения из других потоков, разблокировать основной тестовый поток и повторно вызвать любые сбои. ConcurrentUnit позаботится обо всем этом за вас:
final Waiter waiter = new Waiter();
new Thread(() -> {
doSomeWork();
waiter.assertTrue(true);
waiter.resume();
}).start();
// Wait for resume() to be called
waiter.await(1000);
Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.
Похожие материалы
- Модульное тестирование Entity Framework 4.0
- Где я могу найти хорошие ресурсы по модульному тестированию для EJB и J2EE?
- Какие объекты имитировать при выполнении TDD
- Чтение из web.config при выполнении исследований Pex
- Ежемесячный таймер Java
- Когда мы должны использовать мьютекс, а когда мы должны использовать семафор