Тестирование с помощью dotnet test

В этой статье представлена информация о команде CLI dotnet test, включая историю совместимости с VSTest и Microsoft.Testing.Platform (MTP).

Команда dotnet test работает в двух основных режимах:

  • VSTest: это режим по умолчанию для dotnet test и единственный режим, доступный до пакета SDK .NET 10. Он предназначен в основном для VSTest, но также может выполнять тесты MTP через Microsoft. Testing.Platform.MSBuild пакет NuGet.
  • режим MTP: представлен с пакетом SDK .NET 10, этот режим поддерживает исключительно тестовые приложения, созданные с помощью MTP.

Подсказка

Для справки по CLI см. dotnet test.

Режим VSTest dotnet test

В течение длительного времени VSTest была единственной тестовой платформой в .NET. Следовательно, dotnet test был разработан исключительно для VSTest, с всеми параметрами командной строки, адаптированными к VSTest.

Процесс включает вызов цели MSBuild VSTest, которая активирует другие внутренние цели для запуска и в конечном итоге запускает vstest.console. Все dotnet test параметры командной строки переводятся в эквиваленты в vstest.console.

Запуск проектов MTP с помощью режима VSTest

dotnet test предназначен для запуска проектов VSTest в режиме VSTest. Однако можно запускать проекты MTP в режиме dotnet test VSTest с помощью пакета Microsoft.Testing.Platform.MSBuild. С точки зрения пользователя, эта поддержка включена, установив значение TestingPlatformDotnetTestSupport для свойства MSBuild true (по умолчанию это false по причинам обратной совместимости). Если для этого свойства задано значение true, Microsoft. Testing.Platform.MSBuild изменяет поведение целевого объекта VSTest, перенаправляя его для вызова InvokeTestingPlatform. InvokeTestingPlatform — это целевой объект MSBuild, включенный в Microsoft. Testing.Platform.MSBuild, отвечающий за правильное выполнение тестовых приложений MTP в качестве исполняемых файлов. Параметры командной строки, относящиеся к VSTest, такие как --logger, автоматически игнорируются в этом режиме. Чтобы включить аргументы, относящиеся к MTP, например --report-trx, их необходимо добавить после дополнительного --. Например: dotnet test -- --report-trx. В MTP 1.9 предупреждение с кодом MTP0001 создается при обнаружении аргумента, который автоматически игнорируется.

Примечание.

MSTest и NUnit используют пакет Microsoft.Testing.Extensions.VSTestBridge. Установив EnableMSTestRunner или EnableNUnitRunner (что включает MTP), ваш тестовый проект будет поддерживать как VSTest, так и MTP. В этом сценарии, если вы используете режим dotnet test VSTest и не установите значение true для TestingPlatformDotnetTestSupport, вы фактически работаете полностью с VSTest, как если бы значения true не были установлены для EnableMSTestRunner и EnableNUnitRunner.

Примечание.

Настоятельно рекомендуется задать TestingPlatformDotnetTestSupport свойство в Directory.Build.props. Это гарантирует, что вам не нужно добавлять его в каждый файл тестового проекта по отдельности. Кроме того, он предотвращает внедрение нового тестового проекта, который не задает это свойство, что может привести к решению, в котором некоторые проекты используют VSTest, а другие используют MTP. Эта смешанная конфигурация может работать неправильно и является неподдерживаемой ситуацией.

Это важно

Запуск проектов MTP в режиме VSTest считается устаревшим в пользу более нового интерфейса в .NET 10 SDK. Поддержка выполнения в этом режиме будет удалена в MTP версии 2 при запуске с .NET 10 SDK. Поддержка остается доступной для пакета SDK .NET 9 и более ранних версий для обеспечения обратной совместимости. Дополнительные сведения см. в разделе "Миграция на режим MTP dotnet test".

В следующем списке описаны параметры командной dotnet test строки команды в режиме VSTest, поддерживаемые MTP. Эти параметры относятся к процессу сборки и не передаются в VSTest, поэтому они работают с MTP.

  • -a|--arch <ARCHITECTURE>
  • --artifacts-path <ARTIFACTS_DIR>
  • -c|--configuration <CONFIGURATION>
  • -f|--framework <FRAMEWORK>
  • -e|--environment <NAME="VALUE">
  • --interactive
  • --no-build
  • --nologo
  • --no-restore
  • -o|--output <OUTPUT_DIRECTORY>
  • --os <OS>
  • -r|--runtime <RUNTIME_IDENTIFIER>
  • -v|--verbosity <LEVEL>

Подсказка

Аргументы командной строки тестового приложения можно настроить с помощью TestingPlatformCommandLineArguments свойства MSBuild:

<PropertyGroup>
  ...
  <TestingPlatformCommandLineArguments>--minimum-expected-tests 10</TestingPlatformCommandLineArguments>
</PropertyGroup>

Показать сбой для каждого теста

По умолчанию тестовые сбои суммируются в файл .log, а в MSBuild сообщается один сбой для каждого тестового проекта.

Чтобы отобразить ошибки для каждого неудачного теста, укажите -p:TestingPlatformShowTestsFailure=true в командной строке или добавьте свойство <TestingPlatformShowTestsFailure>true</TestingPlatformShowTestsFailure> в файл проекта.

В командной строке:

dotnet test -p:TestingPlatformShowTestsFailure=true

Показать полные выходные данные платформы

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

Чтобы отобразить эти сведения вместе с выходными данными MSBuild, используйте <TestingPlatformCaptureOutput>false</TestingPlatformCaptureOutput>.

Этот параметр не влияет на то, как платформа тестирования записывает выходные данные пользователей, написанные Console.WriteLine или другими аналогичными способами записи в консоль.

В командной строке:

dotnet test -p:TestingPlatformCaptureOutput=false

Дополнительные технические сведения

В dotnet test режиме VSTest используется -- для указания аргументов RunSettings. Изначально dotnet test предназначалось для передачи этих аргументов в качестве свойства MSBuild, которое называется VSTestCLIRunSettings. Таким образом, при выполнении тестовых приложений MTP в VSTest режиме мы переопределяем значение VSTestCLIRunSettings для представления аргументов приложения.

Сочетание VSTest и MTP

При выполнении dotnet test в режиме VSTest рекомендуется избегать включения VSTest и MTP в одном решении.

Этот сценарий официально не поддерживается, и следует учитывать следующее:

  • Параметры командной строки, относящиеся к VSTest, будут применяться только к проектам VSTest, а не к тестовых приложениям MTP.
  • Параметры командной строки, относящиеся к MTP, указанные после #D0, будут рассматриваться как аргументы RunSettings для проектов VSTest.

Основные выводы

  • Чтобы запустить тестовые приложения MTP в режиме dotnet test VSTest, следует использовать Microsoft.Testing.Platform.MSBuild, передать параметры командной строки для MTP после дополнительных -- и задать для параметра TestingPlatformDotnetTestSupport значение true.
  • Параметры командной строки, ориентированные на VSTest, игнорируются автоматически.

Из-за этих проблем .NET появился новый режим dotnet test специально предназначен для MTP. Мы рекомендуем пользователям MTP перейти с режима VSTest dotnet test в новый режим с помощью пакета SDK .NET 10.

Режим MTP dotnet test

Чтобы устранить проблемы, возникающие при запуске dotnet test с MTP в режиме VSTest, в пакете SDK .NET 10 был представлен новый режим, который специально разработан для MTP.

Чтобы включить этот режим, добавьте в файл следующую конфигурацию global.json :

{
    "test": {
        "runner": "Microsoft.Testing.Platform"
    }
}

Это важно

Интерфейс dotnet test для MTP поддерживается только в Microsoft.Testing.Platform версии 1.7 и более поздних версиях.

Так как этот режим специально предназначен для MTP, ни TestingPlatformDotnetTestSupport, ни дополнительные -- не требуются.

Это важно

Этот режим совместим только с MTP версии 1.7.0 и более поздней.

Это важно

Если тестовый проект поддерживает VSTest, но не поддерживает MTP, будет создана ошибка.

Подсказка

Аргументы командной строки тестового приложения можно настроить с помощью TestingPlatformCommandLineArguments свойства MSBuild:

<PropertyGroup>
  ...
  <TestingPlatformCommandLineArguments>--minimum-expected-tests 10</TestingPlatformCommandLineArguments>
</PropertyGroup>

Перейдите в режим MTP dotnet test

Для пользователей MTP, использующих режим dotnet testVSTest, существует несколько действий, необходимых для миграции на более новый dotnet test интерфейс:

  1. Добавьте test раздел в global.json файл, как показано выше.
  2. Удалите TestingPlatformDotnetTestSupport свойство MSBuild, так как оно больше не требуется.
  3. Удалите свойства MSBuild TestingPlatformCaptureOutput и TestingPlatformShowTestsFailure, так как они больше не используются новым dotnet test.
  4. Удалите дополнительные --, например, dotnet test -- --report-trx должно стать dotnet test --report-trx.
  5. При передаче определенного решения (или каталога, содержащего решение), например, dotnet test MySolution.slnэто должно стать dotnet test --solution MySolution.sln.
  6. При передаче определенного проекта (или каталога, содержащего проект), например, dotnet test MyProject.csprojэто должно стать dotnet test --project MyProject.csproj.
  7. При передаче определенной библиотеки DLL, например, dotnet test path/to/UnitTests.dll, это должно стать dotnet test --test-modules path/to/UnitTests.dll. Обратите внимание, что --test-modules также поддерживает глоббинг.