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 Microsoft.Testing.Platform.
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 hai bisogno di un elenco unico delle opzioni della riga di comando della piattaforma e delle estensioni, consulta il riferimento alle opzioni CLI di Microsoft.Testing.Platform.
Acconsentire esplicitamente all'uso di Microsoft.Testing.Platform
Il primo passaggio della migrazione consiste nell'acconsentire esplicitamente all'uso di Microsoft.Testing.Platform.
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
Microsoft.Testing.Platform è 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 utilizza MSTest.Sdk, Microsoft.Testing.Platform viene utilizzato per impostazione predefinita, a meno che <UseVSTest>true</UseVSTest> non sia stato specificato.
NUnit
Microsoft.Testing.Platform è 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
Microsoft.Testing.Platform è 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 è disponibile alcun supporto nativo per Microsoft.Testing.Platform 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 di Microsoft.Testing.Platform 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 Microsoft.Testing.Platform. 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 Microsoft.Testing.Platform |
--blame |
Non rilevante per Microsoft.Testing.Platform |
--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 Microsoft.Testing.Platform è diverso e non esiste tale argomento centralizzato da usare da tutti gli agenti di raccolta dati. Con Microsoft.Testing.Platform, 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 Microsoft.Testing.Platform, diventa:
dotnet test --coverage --coverage-output-format cobertura
Importante
Come spiegato in precedenza, quando si usa Microsoft.Testing.Platform con VSTest, è necessario un ulteriore dotnet test prima di passare gli argomenti 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 Microsoft.Testing.Platform.
xUnit.net, non supporta lo stesso formato di filtro durante l'esecuzione con Microsoft.Testing.Platform. È 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 si chiama solitamente "logger" in VSTest è chiamato "reporter" in Microsoft.Testing.Platform. In Microsoft.Testing.Platform 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 Microsoft.Testing.Platform, qualsiasi reporter). Ogni reporter di Microsoft.Testing.Platform ha la libertà di aggiungere una propria opzione della riga di comando e, pertanto, non esiste un'opzione della riga di comando centralizzata come quella di 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 Microsoft.Testing.Platform, 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 Microsoft.Testing.Platform con VSTest, è necessario un ulteriore dotnet test prima di passare gli argomenti 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 Microsoft.Testing.Platform ed è stato sostituito da un file di configurazione più moderno testconfig.json . Tuttavia, MSTest e NUnit supportano ancora runSettings precedenti durante l'esecuzione di Microsoft.Testing.Platform 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 usa Visual Studio o Esplora test di Visual Studio Code, potrebbe essere necessario abilitare il supporto per Microsoft.Testing.Platform.
Visual Studio
Esplora Test di Visual Studio supporta Microsoft.Testing.Platform 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 Microsoft.Testing.Platform.
Azure DevOps
Quando si usano le attività di Azure DevOps, potrebbe essere necessario aggiornare la pipeline per usare Microsoft.Testing.Platform, 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 nativa di Microsoft.Testing.Platform 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 punta, 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 Microsoft.Testing.Platform
Esecuzione di nessun test
Se un assembly di test ha eseguito zero test, VSTest tollera che e termina con esito positivo. Tuttavia, Microsoft.Testing.Platform 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 Microsoft.Testing.Platform.
- Con Microsoft.Testing.Platform, la codifica viene sempre preservata.
- Con VSTest non in esecuzione in modalità di isolamento (il comportamento predefinito di vstest.console), tale codifica viene mantenuta, simile a Microsoft.Testing.Platform.
- 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.