Я довольно плохо знаком с поблочным тестированием и в настоящее время экспериментирующий немного с инструментами тестирования Visual Studio.
Мой вопрос состоит в том, как определить утверждения о параллельном поведении в этих тестах. Например, учитывая класс BoundedChan<T>
реализация ограниченного канала, как я могу определить тесты как
channel.Send
не заблокируется" илиchannel.Send
заблокируется, пока значение не читается"Существует ли изящное решение записать эти утверждения?
Вот статья в блоге , в которой обсуждается эта тема; он ориентирован на NUnit.
К сожалению, параллелизм по-прежнему является областью модульного тестирования, которую сложно легко структурировать. Это непростая проблема, и она по-прежнему требует, чтобы вы реализовали в тесте некоторую собственную логику синхронизации и параллелизма.
В приведенном вами примере может оказаться невозможным написать тест, который окончательно демонстрирует, что метод будет или не будет блокироваться при определенных условиях. Вы можете достичь определенного уровня уверенности, сначала создав наихудшие обстоятельства, при которых вы ожидаете блокирующего поведения, а затем напишите тесты, чтобы определить, происходит это или нет.
Это должно быть интересное чтение -> http://c2.com/cgi-bin/wiki?ExtremeProgrammingChallengeFourteen
Этот вопрос может дать достаточно содержания, чтобы заполнить книгу.
В общем, я бы не рекомендовал добавлять в классы модульные тесты для параллельных сценариев. На практике, я думаю, вы поймете, что автоматические модульные тесты имеют одну или несколько «сладких точек» - и что сосредоточение ваших усилий в этих областях (и использование других методов в других областях) дает более высокую рентабельность инвестиций.
Но ваш класс, похоже, о параллелизме (не может сказать наверняка на основе предоставленной информации), и поэтому это может быть тот случай, когда вам действительно нужен тест, имитирующий параллелизм.
Вы можете (насколько я знаю) запускать несколько потоков в модульном тесте, если хотите. Но может быть способ попроще. Рассмотрите возможность использования паттерна Compose Method . Раз уж мы заговорили об этой теме - этот шаблон очень важен для эффективных модульных тестов в целом, а не только для параллелизма.