Как смоделировать параллелизм в модульных тестах?

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

Мой вопрос состоит в том, как определить утверждения о параллельном поведении в этих тестах. Например, учитывая класс BoundedChan<T> реализация ограниченного канала, как я могу определить тесты как

  1. "channel.Send не заблокируется" или
  2. "Если мощность канала превышена, channel.Send заблокируется, пока значение не читается"

Существует ли изящное решение записать эти утверждения?

14
задан Dario 8 January 2010 в 17:46
поделиться

3 ответа

Вот статья в блоге , в которой обсуждается эта тема; он ориентирован на NUnit.

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

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

6
ответ дан 1 December 2019 в 15:01
поделиться

Это должно быть интересное чтение -> http://c2.com/cgi-bin/wiki?ExtremeProgrammingChallengeFourteen

0
ответ дан 1 December 2019 в 15:01
поделиться

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

В общем, я бы не рекомендовал добавлять в классы модульные тесты для параллельных сценариев. На практике, я думаю, вы поймете, что автоматические модульные тесты имеют одну или несколько «сладких точек» - и что сосредоточение ваших усилий в этих областях (и использование других методов в других областях) дает более высокую рентабельность инвестиций.

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

Вы можете (насколько я знаю) запускать несколько потоков в модульном тесте, если хотите. Но может быть способ попроще. Рассмотрите возможность использования паттерна Compose Method . Раз уж мы заговорили об этой теме - этот шаблон очень важен для эффективных модульных тестов в целом, а не только для параллелизма.

4
ответ дан 1 December 2019 в 15:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: