Юнит-тестирование многопоточных приложений - PullRequest
4 голосов
/ 12 октября 2010

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

Ответы [ 4 ]

3 голосов
/ 12 октября 2010

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

2 голосов
/ 12 октября 2010

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

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

Тем не менее, существует несколько экспериментальных платформ для нагрузочного тестирования для тестирования одновременных приложений, таких как Microsoft CHESS - CHESS многократно запускает данный модульный тест и систематически исследует все возможные чередования одновременныхтестовое задание.Это делает ваши модульные тесты надежными и воспроизводимыми.

На данный момент, однако, CHESS все еще экспериментален (и, вероятно, не может использоваться с JVM) - на данный момент придерживайтесь нагрузочного тестирования, чтобы отсеять проблемы параллелизма.

2 голосов
/ 12 октября 2010
1 голос
/ 24 июля 2015

Нет ничего плохого в тестировании многопоточного кода, особенно если многопоточность - точка кода, который вы тестируете.Общий подход к тестированию многопоточного / асинхронного кода состоит в том, чтобы блокировать основной тестовый поток, захватывать любые ошибочные утверждения из других потоков, разблокировать основной тестовый поток и повторно выводить любые сбои. ConcurrentUnit позаботится о большей части этого для вас:

  final Waiter waiter = new Waiter();

  new Thread(() -> {
    doSomeWork();
    waiter.assertTrue(true);
    waiter.resume();
  }).start();

  // Wait for resume() to be called
  waiter.await(1000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...