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] атрибут, который может быть добавлен на уровне теста, класса и сборки.