Мне показалось, что я понял, как работает параллельное выполнение теста MbUnit, но поведение, которое я вижу, довольно сильно отличается от моего ожидания, что я подозреваю, что что-то упустил!
У меня есть набор тестов пользовательского интерфейса, которые я хочу запустить одновременно. Все тесты находятся в одной сборке, разделенной на три разных пространства имен. Все тесты полностью независимы друг от друга, поэтому я бы хотел, чтобы все они имели право на параллельное выполнение.
Для этого я добавил в AssemblyInfo.cs следующее:
[assembly: DegreeOfParallelism(8)]
[assembly: Parallelizable(TestScope.All)]
Насколько я понимаю, эта комбинация атрибутов сборки должна привести к тому, что все тесты будут считаться [Parallelizable]
, и что исполнитель теста должен использовать 8 потоков во время выполнения. Мои индивидуальные тесты помечены атрибутом [Test]
и ничем иным. Ни один из них не управляется данными.
Тем не менее, на самом деле я вижу не более 5-6 потоков, что означает, что мои тесты выполняются дольше, чем они должны быть.
Я что-то упустил? Нужно ли что-то еще делать, чтобы бегун использовал все мои 8 потоков?
N.B. Поведение одинаково независимо от того, какого бегуна я использую. GUI, командная строка и TD.Net бегуны ведут себя так же, как описано выше, снова заставляя меня думать, что я что-то пропустил.
РЕДАКТИРОВАТЬ: Как указано в комментариях, я использую MbUnit v3.1 (обновление 2, сборка 397). Документация предполагает, что атрибут уровня сборки [parallelizable]
доступен, но, похоже, он также ссылается на v3.2 платформы, несмотря на то, что он еще не доступен.
РЕДАКТИРОВАТЬ 2: Для дальнейшего уточнения, структура моей сборки выглядит следующим образом:
assembly
- namespace
- fixture
- tests (each carrying only the [Test] attribute)
- fixture
- tests (each carrying only the [Test] attribute)
- namespace
- fixture
- tests (each carrying only the [Test] attribute)
- fixture
- tests (each carrying only the [Test] attribute)
- namespace
- fixture
- tests (each carrying only the [Test] attribute)
- fixture
- tests (each carrying only the [Test] attribute)
РЕДАКТИРОВАТЬ 3: Хорошо, теперь я заметил, что, если я запускаю только один прибор за раз, максимальное количество одновременно выполняемых тестов всегда равно 8. Как только я выбираю несколько приборов, оно падает до 5 или 6. Если я возьму содержимое двух приборов (в настоящее время они содержат 12 тестов каждый) и уроню их в один прибор (всего 24 теста в этом одном приборе), этот прибор также будет всегда работать 8 тесты одновременно.
Это, кажется, показывает, что это не проблема в отдельных тестах, а скорее в том, как атрибуты уровня сборки просачиваются вниз к приспособлению, или как исполнитель тестов использует эти атрибуты.
Кроме того, я также заметил (при запуске двух приборов), как только один из двух приборов был выполнен полностью, бегун начинает выполнять больше тестов одновременно, когда он возвращается к работе только одного прибора. Для меня прямо сейчас, первый прибор завершается, когда во втором приборе осталось 7 тестов. Как только это происходит, количество одновременно запущенных тестов увеличивается с предыдущих 5 или 6 до максимально возможного значения 7.