Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Модульное тестирование многопоточных приложений

Автор вопроса: VladimirОтветов: 4

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

unit-testingmultithreadingjunit

Ответы

Ответ 1 · рейтинг 2 · Abhijeet Kashnia

Попробуйте многопоточныйTC

http://code.google.com/p/multithreadedtc-junit4/

Ответ 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.

Похожие материалы