Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Z tego artykułu dowiesz się, jak przeprowadzić migrację z programu VSTest do MTP.
Ten artykuł koncentruje się na krokach migracji i mapowaniu argumentów.
Jeśli nadal musisz wybrać platformę, zacznij od omówienia platform testowych.
Jeśli potrzebujesz szczegółowego zachowania trybów dotnet test, odwołaj się do polecenia Testowanie za pomocą dotnet test.
Jeśli potrzebujesz pojedynczej listy opcji wiersza polecenia platformy i rozszerzeń, zobacz dokumentację opcji CLI MTP.
Wyrażanie zgody na korzystanie z protokołu MTP
Pierwszym krokiem migracji jest skorzystanie z protokołu MTP.
Dla wszystkich frameworków testowych dodaj <OutputType>Exe</OutputType> do wszystkich projektów testowych w rozwiązaniu. Następnie postępuj zgodnie ze wskazówkami specyficznymi dla platformy.
MSTest
Protokół MTP jest obsługiwany przez bibliotekę MSTest, począwszy od wersji 3.2.0. Zalecamy jednak zaktualizowanie do najnowszej dostępnej wersji MSTest.
Aby wyrazić zgodę, dodaj <EnableMSTestRunner>true</EnableMSTestRunner> pod elementem PropertyGroup w pliku Directory.Build.props.
Uwaga / Notatka
W przypadku korzystania z zestawu MSTest.Sdk protokół MTP jest używany domyślnie, chyba że <UseVSTest>true</UseVSTest> zostanie określony.
NUnit
MTP jest obsługiwany przez NUnit3TestAdapter począwszy od wersji 5.0.0.
Aby wyrazić zgodę, dodaj <EnableNUnitRunner>true</EnableNUnitRunner> pod elementem PropertyGroup w pliku Directory.Build.props.
xUnit.net
MTP jest obsługiwane od wersji xunit.v3.
Aby wyrazić zgodę, dodaj <UseMicrosoftTestingPlatformRunner>true</UseMicrosoftTestingPlatformRunner> pod elementem PropertyGroup w pliku Directory.Build.props.
dotnet test
Zgoda na zestaw .NET 9 SDK i jego wcześniejsze wersje
W .NET 9 zestawach SDK i starszych nie ma rodzimej obsługi protokołu MTP dla dotnet test. Obsługa jest oparta na infrastrukturze VSTest. Aby tego użyć, dodaj <TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport> pod PropertyGroup w pliku Directory.Build.props.
Ważne
W przypadku uruchamiania obsługi MTP w tym trybie należy dodać -- , aby oddzielić dotnet test argumenty od nowych argumentów platformy. Na przykład dotnet test --no-build -- --list-tests.
Zgoda na korzystanie z zestawu .NET 10 SDK i nowszych wersji
Począwszy od zestawu SDK .NET 10, zapewnia się natywną obsługę MTP. Aby go użyć, należy określić moduł uruchamiający testy, jak Microsoft.Testing.Platform w global.json:
{
"test": {
"runner": "Microsoft.Testing.Platform"
}
}
Ważne
W tym trybie dodatkowa -- nie jest już używana.
Zaktualizuj wywołania dotnet test
Opcje dotnet test wiersza polecenia są podzielone na dwie kategorie: argumenty związane z kompilacją i powiązane z testami.
Argumenty związane z kompilacją nie mają znaczenia dla platformy testowej i w związku z tym nie muszą być aktualizowane dla nowej platformy. Argumenty związane z kompilacją są wymienione tutaj:
-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>
Argumenty związane z testem są specyficzne dla programu VSTest i dlatego należy je przekształcić w celu dopasowania do nowej platformy. W poniższej tabeli przedstawiono mapowanie między argumentami VSTest a nową platformą:
| Argument VSTest | Nowy parametr platformy |
|---|---|
--test-adapter-path <ADAPTER_PATH> |
Nie dotyczy MTP |
--blame |
Nie dotyczy MTP |
--blame-crash |
--crashdump (wymaga rozszerzenia zrzutu pamięci) |
--blame-crash-dump-type <DUMP_TYPE> |
--crashdump-type (wymaga rozszerzenia zrzutu pamięci) |
--blame-crash-collect-always |
Niewspierane |
--blame-hang |
--hangdump (wymaga rozszerzenia "Hang dump") |
--blame-hang-dump-type <DUMP_TYPE> |
--hangdump-type (wymaga rozszerzenia "Hang dump") |
--blame-hang-timeout <TIMESPAN> |
--hangdump-timeout (wymaga rozszerzenia "Hang dump") |
--collect <DATA_COLLECTOR_NAME> |
Zależy od modułu zbierającego dane |
-d\|--diag <LOG_FILE> |
--diagnostic |
--filter <EXPRESSION> |
Zależy od wybranej platformy testowej |
-l\|--logger <LOGGER> |
Zależy od rejestratora |
--results-directory <RESULTS_DIR> |
--results-directory <RESULTS_DIR> |
-s\|--settings <SETTINGS_FILE> |
Zależy od wybranej platformy testowej |
-t\|--list-tests |
--list-tests |
-- <RunSettings arguments> |
--test-parameter (dostarczone przez VSTestBridge) |
--collect
--collect to ogólny punkt rozszerzalności w programie VSTest dla dowolnego modułu zbierającego dane. Model rozszerzalności MTP jest inny i nie ma tak scentralizowanego argumentu, który ma być używany przez wszystkie moduły zbierające dane. W przypadku protokołu MTP każdy moduł zbierający dane może dodać własną opcję wiersza polecenia. Na przykład uruchomienie programu Microsoft CodeCoverage za pośrednictwem programu VSTest może być podobne do następujących:
dotnet test --collect "Code Coverage;Format=cobertura"
W przypadku protokołu MTP staje się to następujące:
dotnet test --coverage --coverage-output-format cobertura
Ważne
Jak wyjaśniono wcześniej, w przypadku korzystania z protokołu MTP z opartą dotnet testna narzędziu VSTest dodatkowe -- informacje są potrzebne przed przekazaniem argumentów do platformy.
Tak więc to staje się dotnet test -- --coverage --coverage-output-format cobertura.
--filter
--filter jest filtrem opartym na programie VSTest.
Narzędzia MSTest i NUnit obsługują ten sam format filtru, nawet w przypadku uruchamiania z użyciem protokołu MTP.
xUnit.net nie obsługuje tego samego formatu filtru podczas uruchamiania z MTP. Należy przeprowadzić migrację z filtru opartego na VSTest do nowej obsługi filtru w xunit.v3, co jest realizowane za pomocą następujących opcji wiersza poleceń.
Opcje specyficzne dla xUnit.net:
--filter-class--filter-not-class--filter-method--filter-not-method--filter-namespace--filter-not-namespace--filter-trait--filter-not-trait--filter-query
Aby uzyskać więcej informacji, zobacz dokumentację Microsoft.Testing.Platform dotyczącą języka xUnit.net i języka filtrowania zapytań dla xUnit.net.
--logger
To, co w programie VSTest zwykle nazywa się "rejestratorem", jest określane jako "reporter" w MTP. W usłudze MTP rejestrowanie jest jawnie przeznaczone tylko do celów diagnostycznych.
Podobnie jak --collect, --logger jest ogólnym punktem rozszerzalności w programie VSTest dla dowolnego rejestratora (lub, w kontekście protokołu MTP, dowolnego reportera). Każdy reporter MTP ma swobodę dodawania własnej opcji wiersza polecenia, w związku z czym nie ma scentralizowanej opcji wiersza polecenia, takiej jak w VSTest.
Jednym z bardzo często używanych rejestratorów VSTest jest rejestrator TRX. Ten rejestrator jest zwykle wywoływany w następujący sposób:
dotnet test --logger trx
W przypadku protokołu MTP polecenie staje się następujące:
dotnet test --report-trx
Ważne
Aby użyć --report-trx, musisz mieć zainstalowany pakiet NuGet Microsoft.Testing.Extensions.TrxReport.
Ważne
Jak wyjaśniono wcześniej, podczas korzystania z MTP razem z narzędziem VSTest, konieczne jest dodanie -- przed przekazaniem argumentów do platformy.
Tak więc to staje się dotnet test -- --report-trx.
--settings
Narzędzia VSTest's --settings są używane do określenia pliku RunSettings dla uruchomienia testów. Element RunSettings nie jest obsługiwany przez rdzeń MTP i został zastąpiony bardziej nowoczesnym testconfig.json plikiem konfiguracji. Jednak narzędzia MSTest i NUnit nadal obsługują stare ustawienia RunSettings podczas uruchamiania protokołu MTP i --settings nadal są obsługiwane.
vstest.console.exe
Jeśli używasz vstest.console.exe bezpośrednio, zalecamy zastąpienie go poleceniem dotnet test .
Eksplorator testów
W przypadku korzystania z eksploratora testów Visual Studio lub Visual Studio Code może być konieczne włączenie obsługi protokołu MTP.
Visual Studio
Visual Studio Eksplorator testów obsługuje protokół MTP począwszy od wersji 17.14. Jeśli używasz starszej wersji, może być konieczne zaktualizowanie programu Visual Studio do najnowszej wersji.
Visual Studio Code
Visual Studio Code z zestawem deweloperskim języka C# obsługuje protokół MTP.
Azure DevOps
W przypadku korzystania z zadań Azure DevOps, może być konieczne zaktualizowanie potoku, aby użyć protokołu MTP, w zależności od konkretnego zadania, którego używasz.
VsTest, zadanie
Jeśli używasz zadania VSTest w usłudze Azure DevOps, możesz zastąpić je zadaniem platformy .NET Core.
Zadanie interfejsu wiersza polecenia platformy .NET Core
Jeśli przekazano niestandardowe
argumentsdo zadania, postępuj zgodnie z tymi samymi wskazówkami dotyczącymi migracjidotnet test.Jeśli używasz DotNetCoreCLI bez zaznaczenia opcji natywnego środowiska MTP dla zestawu SDK .NET 10 i nowszych za pośrednictwem pliku
global.json, zadanieargumentsmusi być ustawione tak, aby prawidłowo wskazywać katalog wyników, który był wcześniej używany, oraz żądany raport TRX. Przykład:- task: DotNetCoreCLI@2 displayName: Run unit tests inputs: command: 'test' arguments: '-- --report-trx --results-directory $(Agent.TempDirectory)'
Różnice behawioralne między narzędziami VSTest i MTP
Uruchamianie testów zerowych
Jeśli zestaw testowy nie uruchomił żadnych testów, program VSTest toleruje to i zakończy się powodzeniem. Jednak MTP kończy się niepowodzeniem z kodem wyjścia 8. Istnieje wiele sposobów obejścia tego:
Przekaż
--ignore-exit-code 8podczas uruchamiania testów.Jeśli chcesz zignorować ten kod zakończenia dla określonego projektu testowego, dodaj następujący kod w pliku projektu:
<PropertyGroup> <TestingPlatformCommandLineArguments>$(TestingPlatformCommandLineArguments) --ignore-exit-code 8</TestingPlatformCommandLineArguments> </PropertyGroup>Użyj zmiennej środowiskowej
TESTINGPLATFORM_EXITCODE_IGNORE.
Zachowanie Console.InputEncoding
Jeśli uruchamiasz testy w konsoli, w której strona kodowa została jawnie zmieniona (na przykład w Azure DevOps, strona kodowa jest ustawiona na 65001, która odpowiada UTF8), zachowanie może być inne między programem VSTest i MTP.
- W przypadku protokołu MTP kodowanie jest zawsze zachowywane.
- Jeśli program VSTest nie działa w trybie izolacji (domyślne zachowanie vstest.console), to kodowanie jest zachowywane, podobnie jak W przypadku protokołu MTP.
- W programie VSTest uruchomionym w trybie izolacji (domyślne zachowanie
dotnet test) kodowanie nie jest zachowywane w hoście testowym, czyli w procesie, w którym są uruchamiane testy.
Wskazówka
Powodem, dla którego kodowanie nie jest zachowywane w trybie izolacji VSTest, jest to, że proces testhost jest uruchamiany z CreateNoWindow = true. Nie jest więc dołączony do oryginalnej konsoli.
Jeśli masz test, który uruchamia kolejny proces podrzędny i przekierowuje jego standardowe dane wyjściowe, możesz napotkać problemy, jeśli wszystkie następujące elementy mają zastosowanie:
- Strona kodowa konsoli jest ustawiona na wartość 65001 (UTF8). Może tak być w przypadku CI, ale z reguły nie lokalnie. Aby uzyskać lokalne zachowanie podobne do tego w systemie CI, uruchom polecenie
chcp 65001przed uruchomieniem testów. - Proces podrzędny rozpoczyna się od kodowania innego niż UTF8. Może się to również zdarzyć, jeśli twój własny test również ustawia wartość
CreateNoWindow = true.
Jest to szczególnie problematyczne, gdy proces podrzędny nie oczekuje, że napotka bajt BOM UTF8 (znak kolejności bajtów), na co może trafić w poprzednim scenariuszu w środowisku .NET Framework.
Ponieważ ta różnica w zachowaniu może być problematyczna w szczególności dla bajtu BOM, obejściem jest ustawienie InputEncoding podczas inicjowania zestawu na UTF8 bez BOM:
Console.InputEncoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
Innym obejściem tego problemu jest brak użycia CreateNoWindow = true w przypadku procesów podrzędnych, które przekierowują standardowe dane wejściowe.