Как параллельно выполнять единичные тесты (MSTest)?

Я ищу способы запуска тестовых наборов параллельно.

Я знаю настройку .testrunconfig . Это позволяет вам мультиплексировать количество процессоров.

Я хочу запустить 1000 тестов параллельно. Это имеет смысл, потому что я тестирую веб-сервис, поэтому 90% времени, проведенного в тесте, ждут ответа службы.

Любые идеи о том, как это сделать? Тесты написаны для VS, но я открыт для запуска их вне VS.

Позже отредактируйте : команда разработчиков Visual Studio добавила это в обновление VS 2015. 1. См. Ответ Марк Савул ниже.

Большинство пользователей на этой странице забывают упомянуть, что MSTest распараллеливает тесты в отдельных assemblyх . Вы должны разделить свои unittests на несколько .dll, чтобы парализовать его.

Но! Последняя версия – MSTest V2 – теперь МОЖЕТ распараллеливать «in-assembly» (yay!), Вам просто нужно установить пару пакетов nuget в тестовый проект – TestFramework и TestAdapter – как описано здесь https://blogs.msdn.microsoft .com / DevOps / 2018/01/30 / MSTest-v2-в-assembly-параллельное испытания исполнение /

А потом просто добавьте это в свой тестовый проект

 [assembly: Parallelize(Workers = 4, Scope = ExecutionScope.ClassLevel)] 

Вы можете получить до 5, используя метод из тестового блога Team Visual Studio

Имейте в виду, что с этим могут возникнуть проблемы с параллелизмом, поскольку MSTest не полностью изолирует каждый тест (например, перенос статистики, что делает интересным код для запуска кода один раз).

(Не знаю, почему предел равен 5, но MSTest не будет запускать их параллельно, если для параметра parallelTestCount установлено значение более 5. Согласно приведенным ниже комментариям это правило, по-видимому, изменяется с помощью Visual Studio 2013)

Visual Studio 2015 Update 1 добавляет это. https://docs.microsoft.com/visualstudio/releasenotes/vs2015-update1-vs#misc

Для обновления 2 есть кнопка переключения пользовательского интерфейса на панели инструментов в верхней части панели «Проводник» (между полями «группировка» и «поиск»).

Для обновления 1 установите следующие значения в настройках .run

    0   

Значение для MaxCpuCount имеет следующую семантику:

• ‘n’ (где 1 <= n <= количество ядер): будут запускаться процессы до n.

• «n» любого другого значения: количество запущенных процессов будет равно числу доступных ядер на машине.

Я обнаружил, что C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow \ vstest.console.exe будет запускать параллельные тесты с помощью файла .testsettings который выглядит следующим образом:

   These are default test settings for a local test run.              

Ссылка можно найти здесь http://msdn.microsoft.com/en-us/library/vstudio/jj155796.aspx

Вышеупомянутые ответы определенно помогли мне прояснить ситуацию, но этот пункт из блога Джона Кернера: https://johnkoerner.com/vs2015/parallel-test-execution-in-visual-studio-2015-update-1-might-not -be-what-you-expect / был бит, который нам не хватало.

«Параллельное выполнение теста использует доступные ядра на машине и реализуется путем запуска механизма выполнения теста на каждом доступном ядре в виде отдельного процесса и передачи ему контейнера (assembly, DLL или соответствующего артефакта, содержащего тесты для выполнения), ценность тестов для выполнения ».

-> «Отдельный бит контейнера – это кусок, который мне не хватало. Чтобы мои тесты выполнялись параллельно, мне нужно было разделить мои тесты на отдельные тестовые сборки. После этого я увидел, что тесты в разных assemblyх бежали параллельно ».

Итак, да, мы тестировали параллельные тесты в VSTS, используя их удобный флажок «запустить в параллель», но этого было недостаточно, нам пришлось разделить наши тесты на отдельные тестовые проекты. Логически сгруппированы, конечно, не проект-тест, который был бы смешным

  1. Убедитесь, что первый столбец в вашем DataTable является уникальным идентификатором.
  2. Создайте делегат AsyncExecutionTask, который принимает DataRow и ничего не возвращает.
  3. Создайте статический class (ParallelTesting) с помощью метода AsyncExecutionContext, который принимает DataRow и делегат AsyncExecutionTask.
  4. В статическом classе добавьте статическое свойство BatchStarted.
  5. В статическом classе добавьте статическое свойство словаря AsyncExecutionTests.
  6. В методе AsyncExecutionContext добавьте следующее:

     public static void AsyncExecutionContext(DataRow currentRow, AsyncExecutionTask test) { if(!BatchStarted) { foreach(DataRow row in currentRow.Table) { Task testTask = new Task(()=> { test.Invoke(row); }); AsyncExecutionTests.Add(row[0].ToString(), testTask); testTask.Start(); } BatchStarted = true; } Task currentTestTask = AsyncExecutionTests[row[0].ToString()]; currentTestTask.Wait(); if(currentTestTask.Exception != null) throw currentTestTask.Exception; } 
  7. Теперь используйте class следующим образом:

     [TestMethod] public void TestMethod1() { ParallelTesting.AsyncExecutionContext(TestContext.DataRow, (row)=> { //Test Logic goes here. } ); } 

Примечание. Вам нужно будет сделать некоторые манипуляции с исключениями, чтобы заставить их правильно пузыриться (у вас может быть общее исключение здесь, вам понадобится первое исключение). Количество отображаемого времени, которое будет выполняться каждым тестом, больше не будет точным. Вы также захотите очистить class ParallelTesting после завершения последней строки.

Как это работает: логика тестирования завернута в lambda и передается статическому classу, который будет выполнять логику один раз для каждой строки тестовых данных при ее первом вызове (первая строка выполнена). Последовательные вызовы статического classа просто ждут завершения заданного теста.

Таким образом, каждый вызов тестовой среды, созданной в TestMethod, просто собирает результаты теста соответствующего теста, который уже был запущен.

Возможные улучшения:

  • Сделайте AsyncExecutionContext для параметра maxSynchronousTasks.
  • Посмотрите, как фреймворк перемещает полные стеки в неуправляемом коде, чтобы увидеть, может ли Task.Exception быть передано в тестовую среду визуальной студии без повторного уничтожения и уничтожения stacktrace.
  • Как диагностировать и исправить ошибку в Visual Studio (например, 2015, 2017)?
  • Visual Studio 2012 - Intellisense иногда исчезает / ломается
  • Эмулятор Visual studio (2015) для android не работает - XDE.exe - Код выхода 3
  • Откройте файл в Visual Studio с определенным номером строки
  • Событие Post Build Visual Studio - копирование в относительное расположение каталога
  • Установщик Visual Studio 2015 зависает во время установки?
  • Почему F5 не перестраивает проект перед выполнением в Visual Studio?
  • Ошибка эмулятора Windows Phone 8. Что-то произошло при создании коммутатора
  • Как открыть старый проект MVC в Visual Studio 2012 или Visual Studio 2013?
  • C ++ 11 std :: mutex в тупике Visual Studio 2012 при блокировке из DllMain ()
  • Пакеты не загружаются после установки visual studio 2015 RTM
  • Давайте будем гением компьютера.