Как именно работают [Parallelizable] и DegreeOfParallelism в MbUnit? - PullRequest
9 голосов
/ 03 июня 2010

Мне показалось, что я понял, как работает параллельное выполнение теста 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.

Ответы [ 3 ]

6 голосов
/ 03 июня 2010

Согласно примечанию к выпуску из Gallio v3.0.6:

MbUnit поможет вам получить максимальную отдачу от вашего многоядерного процессора. Отметьте любой тест [Parallelizable], и он будет разрешен параллельно с другими параллельными тестами в том же приборе.

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

alt text

Обратите внимание, что если вы хотите, чтобы все тесты в приборе считались распараллеливаемыми, вам все равно нужно добавить [Parallelizable] к каждому из них. (Мы могли бы добавить функцию, чтобы установить ее на уровне устройства или сборки позже на основе отзывов пользователей.)

Также обратите внимание, что если тест или прибор помечены как параллелизуемые, это не означает, что они будут выполняться параллельно с другими тестами, в частности. Ради эффективности мы ограничиваем количество активных потоков тестирования на основе настроенной степени параллелизма. Если вы хотите, чтобы определенное количество экземпляров теста выполнялось параллельно друг другу, рассмотрите возможность использования [ThreadedRepeat].

Параметр степени параллелизма контролирует максимальное количество тестов, которые MbUnit будет пытаться выполнить параллельно друг с другом. По умолчанию степень параллелизма равна количеству процессоров, которые у вас есть, или минимум 2.

Если вам не нравится значение по умолчанию, вы можете переопределить степень параллелизма на уровне сборки следующим образом:

alt text

Я не знаю, помогает ли это. Может быть, Джефф мог бы рассказать подробнее, как он реализовал эту функцию.

0 голосов
/ 22 августа 2014

Переопределение не работает, если одновременно выполняется более 5 тестов.В Sauce Labs имеется 25 систем для одновременного выполнения 25 сценариев, поэтому мы перебиваем DegreeOfParallelism до 20 только 5 операций одновременно[сборка: DegreeOfParallelism (20)] - не работает для Mbunit

0 голосов
/ 08 мая 2014

столкнулся с той же проблемой, мои выводы

  • [Assembly: Parallelizable (...)] на уровне сборки переопределяет атрибуты Parallelizable для прибора и приводит к тому, что тесты прибора будут выполняться по одному, но на параллельном уровне для прибора. Кажется, что максимум 5-6 приборов параллельно.
  • [Parallelizable (TestScope.Descendants)] на уровне приборов приведет к тому, что приборы будут запускаться по одному, а тесты - параллельно. Кажется, что нет максимума на параллельных тестах.

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

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

Позор, это так.

...