Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra come eseguire la migrazione da VSTest a MTP.
Questo articolo è incentrato sui passaggi di migrazione e sul mapping degli argomenti.
Se è ancora necessario scegliere una piattaforma, iniziare con Panoramica delle piattaforme di test.
Se è necessario un comportamento dettagliato delle dotnet test modalità, vedere Test con dotnet test.
Se è necessario un elenco unico delle opzioni della riga di comando per la piattaforma e l'estensione, vedere il riferimento alle opzioni CLI MTP.
Acconsentire esplicitamente all'uso di MTP
Il primo passaggio della migrazione consiste nel acconsentire esplicitamente all'uso di MTP.
Per tutti i framework di test, aggiungere <OutputType>Exe</OutputType> a tutti i progetti di test nella soluzione. Successivamente, seguire le indicazioni specifiche del framework.
MSTest
MTP è supportato da MSTest a partire dalla versione 3.2.0. È tuttavia consigliabile eseguire l'aggiornamento alla versione MSTest più recente disponibile.
Per aderire, aggiungere <EnableMSTestRunner>true</EnableMSTestRunner> sotto un PropertyGroup nel file Directory.Build.props.
Annotazioni
Quando si usa MSTest.Sdk, MTP viene usato per impostazione predefinita, a meno che non <UseVSTest>true</UseVSTest> venga specificato.
NUnit
MTP è supportato da NUnit3TestAdapter a partire dalla versione 5.0.0.
Per aderire, aggiungere <EnableNUnitRunner>true</EnableNUnitRunner> sotto un PropertyGroup nel file Directory.Build.props.
xUnit.net
MTP è supportato a partire da xunit.v3.
Per aderire, aggiungere <UseMicrosoftTestingPlatformRunner>true</UseMicrosoftTestingPlatformRunner> sotto un PropertyGroup nel file Directory.Build.props.
dotnet test
Acconsentire esplicitamente a .NET 9 SDK e versioni precedenti
In .NET 9 SDK e versioni precedenti non esiste alcun supporto native per MTP per dotnet test. Il supporto è basato sull'infrastruttura VSTest. Per usarlo, aggiungere <TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport> sotto un PropertyGroup in un file Directory.Build.props.
Importante
Quando si esegue il supporto MTP in questa modalità, è necessario aggiungere -- per separare gli dotnet test argomenti dai nuovi argomenti della piattaforma. Ad esempio: dotnet test --no-build -- --list-tests.
Acconsentire esplicitamente a .NET 10 SDK e versioni successive
A partire da .NET 10 SDK, è disponibile il supporto nativo per MTP. Per usarlo, è necessario specificare il test runner come Microsoft.Testing.Platform in global.json:
{
"test": {
"runner": "Microsoft.Testing.Platform"
}
}
Importante
In questa modalità, l'extra -- non viene più usato.
Aggiornare dotnet test le chiamate
Le opzioni della riga di comando di dotnet test sono suddivise in due categorie: argomenti correlati alla compilazione e quelli correlati ai test.
Gli argomenti correlati alla compilazione sono irrilevanti per la piattaforma di test e, di conseguenza, non devono essere aggiornati per la nuova piattaforma. Gli argomenti relativi alla build sono elencati qui:
-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>
Gli argomenti correlati al test sono specifici di VSTest e quindi devono essere trasformati in modo che corrispondano alla nuova piattaforma. La tabella seguente illustra il mapping tra gli argomenti VSTest e la nuova piattaforma:
| Argomento VSTest | Nuovo argomento della piattaforma |
|---|---|
--test-adapter-path <ADAPTER_PATH> |
Non rilevante per MTP |
--blame |
Non rilevante per MTP |
--blame-crash |
--crashdump (richiede l'estensione di dump di arresto anomalo del sistema) |
--blame-crash-dump-type <DUMP_TYPE> |
--crashdump-type (richiede l'estensione di dump di arresto anomalo del sistema) |
--blame-crash-collect-always |
Non supportato |
--blame-hang |
--hangdump (richiede l'estensione Hang dump) |
--blame-hang-dump-type <DUMP_TYPE> |
--hangdump-type (richiede l'estensione Hang dump) |
--blame-hang-timeout <TIMESPAN> |
--hangdump-timeout (richiede l'estensione Hang dump) |
--collect <DATA_COLLECTOR_NAME> |
Dipende dall'agente di raccolta dati |
-d\|--diag <LOG_FILE> |
--diagnostic |
--filter <EXPRESSION> |
Dipende dal framework di test selezionato |
-l\|--logger <LOGGER> |
Dipende dal logger |
--results-directory <RESULTS_DIR> |
--results-directory <RESULTS_DIR> |
-s\|--settings <SETTINGS_FILE> |
Dipende dal framework di test selezionato |
-t\|--list-tests |
--list-tests |
-- <RunSettings arguments> |
--test-parameter (fornito da VSTestBridge) |
--collect
--collect è un punto di estendibilità generale in VSTest per qualsiasi agente di raccolta dati. Il modello di estendibilità di MTP è diverso e non esiste un argomento centralizzato di questo tipo da usare da tutti gli agenti di raccolta dati. Con MTP, ogni agente di raccolta dati può aggiungere una propria opzione della riga di comando. Ad esempio, l'esecuzione di Microsoft CodeCoverage tramite VSTest potrebbe essere simile alla seguente:
dotnet test --collect "Code Coverage;Format=cobertura"
Con MTP, diventa:
dotnet test --coverage --coverage-output-format cobertura
Importante
Come spiegato in precedenza, quando si usa MTP con VSTest, dotnet test è necessario un -- aggiuntivo prima degli argomenti da passare alla piattaforma.
Quindi, questo diventa dotnet test -- --coverage --coverage-output-format cobertura.
--filter
--filter è il filtro basato su VSTest.
MSTest e NUnit supportano lo stesso formato di filtro anche durante l'esecuzione con MTP.
xUnit.net, non supporta lo stesso formato di filtro durante l'esecuzione con MTP. È necessario eseguire la migrazione dal filtro basato su VSTest al nuovo supporto del filtro in xunit.v3, disponibile usando le opzioni della riga di comando seguenti.
xUnit.net opzioni specifiche:
--filter-class--filter-not-class--filter-method--filter-not-method--filter-namespace--filter-not-namespace--filter-trait--filter-not-trait--filter-query
Per altre informazioni, vedere la documentazione di Microsoft.Testing.Platform per xUnit.net e Query Filter Language for xUnit.net.
--logger
Ciò che di solito viene chiamato "logger" in VSTest viene chiamato "reporter" in MTP. In MTP la registrazione viene eseguita in modo esplicito solo a scopo di diagnosi.
Analogamente a --collect, --logger è un punto di estendibilità generale in VSTest per qualsiasi logger (o, nel contesto di MTP, qualsiasi reporter). Ogni reporter MTP è libero di aggiungere una propria opzione della riga di comando e, di conseguenza, non esiste un'opzione della riga di comando centralizzata come VSTest --logger.
Uno dei logger VSTest usati molto comunemente è il logger TRX. Questo logger viene in genere chiamato come segue:
dotnet test --logger trx
Con MTP, il comando diventa:
dotnet test --report-trx
Importante
Per usare --report-trx, è necessario che sia installato il Microsoft.Testing.Extensions.TrxReport pacchetto NuGet.
Importante
Come spiegato in precedenza, quando si usa MTP con VSTest basato su dotnet test, occorre un componente extra -- prima che gli argomenti da passare alla piattaforma.
Quindi, questo diventa dotnet test -- --report-trx.
--settings
VSTest --settings viene usato per specificare un file RunSettings per l'esecuzione del test. RunSettings non è supportato dal core MTP ed è stato sostituito da un file di configurazione più moderno testconfig.json . Tuttavia, MSTest e NUnit supportano ancora runSettings precedenti durante l'esecuzione di MTP ed --settings è ancora supportato.
vstest.console.exe
Se si usa vstest.console.exe direttamente, è consigliabile sostituirlo con il dotnet test comando .
Esploratore di test
Quando si usano Visual Studio o il Test Explorer di Visual Studio Code, potrebbe essere necessario abilitare il supporto per l'MTP.
Visual Studio
Visual Studio Esplora test supporta MTP a partire dalla versione 17.14. Se si usa una versione precedente, potrebbe essere necessario aggiornare Visual Studio alla versione più recente.
Visual Studio Code
Visual Studio Code con C# DevKit supporta MTP.
Azure DevOps
Quando si usano Azure DevOps attività, potrebbe essere necessario aggiornare la pipeline per usare MTP, a seconda dell'attività usata.
Attività VSTest
Se si usa l'attività VSTest in Azure DevOps, è possibile sostituirla con l'attività .NET Core.
Attività CLI di .NET Core
Se hai passato un
argumentspersonalizzato all'attività, segui le stesse indicazioni per la migrazione didotnet test.Se si usa l'attività DotNetCoreCLI senza acconsentire esplicitamente all'esperienza MTP nativa per .NET 10 SDK e versioni successive tramite
global.jsonfile, è necessario impostare l'attivitàargumentsin modo che punti correttamente alla directory dei risultati a cui puntava, nonché al report TRX richiesto. Per esempio:- task: DotNetCoreCLI@2 displayName: Run unit tests inputs: command: 'test' arguments: '-- --report-trx --results-directory $(Agent.TempDirectory)'
Differenze comportamentali tra VSTest e MTP
Esecuzione di nessun test
Se un assembly di test ha eseguito zero test, VSTest tollera che e termina con esito positivo. Tuttavia, MTP ha esito negativo con codice di uscita 8. Esistono diversi modi per risolvere questo problema:
Passa
--ignore-exit-code 8durante l'esecuzione dei test.Se si vuole ignorare il codice di uscita per un progetto di test specifico, aggiungere quanto segue nel file di progetto:
<PropertyGroup> <TestingPlatformCommandLineArguments>$(TestingPlatformCommandLineArguments) --ignore-exit-code 8</TestingPlatformCommandLineArguments> </PropertyGroup>Usare la
TESTINGPLATFORM_EXITCODE_IGNOREvariabile di ambiente.
Conservazione di Console.InputEncoding
Se si eseguono i test in una console in cui la tabella codici è stata modificata in modo esplicito (ad esempio, in Azure DevOps, la tabella codici è impostata su 65001 che corrisponde a UTF8), il comportamento può essere diverso tra VSTest e MTP.
- Con MTP, la codifica è sempre preservata.
- Con VSTest non in esecuzione in modalità di isolamento (il comportamento predefinito di vstest.console), tale codifica viene mantenuta, simile a MTP.
- Con VSTest in esecuzione in modalità di isolamento (comportamento predefinito di
dotnet test), la codifica non viene mantenuta nel testhost, ovvero il processo che esegue i test.
Suggerimento
Il motivo per cui la codifica non viene mantenuta con la modalità di isolamento VSTest è che il processo testhost viene avviato con CreateNoWindow = true. Quindi non è collegato alla console originale.
Se si dispone di un test che avvia ancora un altro processo figlio e ne reindirizza l'output standard, è possibile che si verifichino problemi se si applicano tutte le operazioni seguenti:
- La tabella codici della console è impostata su 65001 (UTF8). Questo può essere il caso nei sistemi di integrazione continua, ma in genere non in ambiente locale. Per ottenere un comportamento locale simile a in CI, eseguire
chcp 65001prima di eseguire i test. - Il processo figlio viene avviato con una codifica diversa da UTF-8. Ciò può verificarsi anche se il tuo test imposta
CreateNoWindow = true.
Ciò è particolarmente problematico quando il processo figlio non si aspetta di ricevere il byte BOM UTF8 (Byte-Order-Mark), che potrebbe incontrare nello scenario precedente su .NET Framework.
Poiché è probabile che questa differenza di comportamento sia problematica specificamente per il byte bom, una soluzione alternativa consiste nell'impostare InputEncoding durante l'inizializzazione dell'assembly su UTF8 senza BOM:
Console.InputEncoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
Una soluzione alternativa consiste nel non utilizzare CreateNoWindow = true per i processi figlio che reindirizzano l'input standard.