NUnit 3: запретить параллельное выполнение тестов
у меня установлен последний NUnit(3.2.0), и все мои тесты выполняются параллельно. Это может выглядеть как желательное поведение, но я не просил об этом и на самом деле он сломал некоторые из моих тестов. У меня есть инициализация в [OneTimeSetUp]
который зависит от потока, и кажется, я не могу ничего сделать, чтобы заставить NUnit последовательно запускать мои тесты. Я читал документация и в нем говорится, что по умолчанию тесты не выполняются параллельно, но на самом деле они!
более того, у меня пытался добавить следующий атрибут: [assembly: Parallelizable(ParallelScope.None)]
- не повезло.
кто-нибудь знает, как изменить это поведение?
P.S. Я запускаю его с ReSharper, но также пробовал с надстройкой MSVS.
UPD: я использую MVVM Light DispatcherHelper.Initialize()
(внутри[OneTimeSetUp]
) для хранения объекта dispatcher, который позже используется несколькими тестами. Если потоки различны (между тестом и методом установки) , то тестируемое действие выполняется асинхронно, а мой тесты проваливаются.
Я проверил идентификаторы потоков в разных тестах, и все они разные.
UPD2: выдержка из документации:
фреймворк NUnit 3.0 может запускать тесты параллельно в собрание. Это совершенно отдельный объект от двигателя Параллельное выполнение теста, хотя возможно использовать оба в тот же тестовый прогон.
по умолчанию, нет параллельное выполнение. Атрибуты используются для указания, какие тесты могут выполняться параллельно и как они связаны с других анализов.
если это не означает, что тесты в сборке не должны выполняться параллельно, пока явно не указано, что это значит? И почему?--2--> не влияет на параллельное выполнение тестов?
UPD3:
Ответ на вопрос можно найти ниже, но если вы застряли(как и я) с the DispatcherHelper.Initialize()
вам просто нужно удалить эту инициализации с OneTimeSetUp
и поместите следующие строки в каждый тест, который использует диспетчеру:
DispatcherHelper.Reset();
DispatcherHelper.Initialize();
2 ответов
NUnit не гарантирует, что все ваши тесты будут выполняться в одном потоке, поэтому наблюдение, что ваши тесты выполняются в разных потоках, не означает, что они работают параллельно.
в документации говорится лишь, что тесты будут выполняться последовательно или параллельно. Вы можете понять, что это означает, что они работают в одном потоке, но есть много причин, по которым внутренняя реализация может потребовать тестов для запуска в разных потоках. Timeout является примером, где мы spawn поток и убить его, если тест тайм-аут, но есть много других.
параллельные тестовые прогоны являются новыми для NUnit 3, поэтому внутренняя реализация изменилась с NUnit 2. Атрибут, который заставляет все тесты в потоке работать в одном потоке, может быть полезен, поэтому не стесняйтесь отправлять запрос на улучшение.
Извините, я не знаком с MVVM Light, поэтому я не могу предложить способы маршалировать обратно в OneTimeSetup нитка.
обновление - поскольку это распространенное использование с web и async, команда NUnit решила предоставить атрибут,который будет требовать выполнения тестов в том же потоке, что иOneTimeSetup
. Это будет в следующем выпуске, либо 3.4, либо в выпуске исправления 3.2.1. Если вы хотите отслеживать прогресс, см. вопрос и pull-запрос.
обновление 2 - теперь вы можете добавить SingleThreadedAttribute
к TestFixture к укажите бегуну, что OneTimeSetUp
, OneTimeTearDown
и все дочерние тесты должны выполняться в одном потоке.
вы можете предотвратить параллельный запуск тестов, добавив [NonParallelizable] атрибут, который может быть добавлен на уровне теста, класса и сборки.