Как точно MbUnit [Parallelizable] и DegreeOfParallelism работают?

Я думал, что понял, как параллельное обработанное выполнение теста MbUnit, но поведение я вижу, отличается достаточно очень от моего ожидания, что я подозреваю, что пропускаю что-то!

У меня есть ряд тестов UI, которые я хочу запустить одновременно. Все тесты находятся в том же блоке, разделенном через три различных пространства имен. Все тесты абсолютно независимы друг от друга, таким образом, я хотел бы, чтобы все они имели право на параллельное выполнение.

С этой целью я поместил следующее в AssemblyInfo.cs:

[assembly: DegreeOfParallelism(8)]

[assembly: Parallelizable(TestScope.All)]

Мое понимание было то, что эта комбинация атрибутов сборки должна заставить все тесты быть рассмотренными [Parallelizable], и что исполнитель тестов должен использовать 8 потоков во время выполнения. Мои отдельные тесты отмечены с [Test] атрибут и ничто иное. Ни один из них не управляем данными.

Однако то, что я на самом деле вижу, является самое большее используемыми потоками 5-6, означая, что мои тестовые прогоны занимают больше времени, чем они должны быть.

Я пропускаю что-то? Я должен сделать что-либо еще, чтобы гарантировать, что все мои 8 потоков используются бегуном?

N.B. Поведение является тем же, независимо от которого бегуна я использую. GUI, командная строка и бегуны TD.Net, все ведут себя то же, как описано выше, снова ведя меня, чтобы думать, что я пропустил что-то.

Править: Как указано в комментариях, я работаю, v3.1 MbUnit (обновите 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.

9
задан BenA 8 June 2010 в 02:25
поделиться

1 ответ

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

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

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

alt text

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

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

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

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

alt text

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

6
ответ дан 3 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: