Microsoft. Risoluzione dei problemi di Testing.Platform (MTP)

Questo articolo contiene indicazioni per la risoluzione dei problemi per MTP.

Codici di uscita

MTP usa codici di uscita noti per comunicare errori di test o errori dell'app. I codici di uscita iniziano da 0 e non sono negativi.

Codice di uscita Dettagli
0 Il 0 codice di uscita indica l'esito positivo. Tutti i test scelti per l'esecuzione sono stati eseguiti fino al completamento e non si sono verificati errori.
1 Il 1 codice di uscita indica errori sconosciuti e funge da catch all. Per trovare informazioni e dettagli aggiuntivi sull'errore, esaminare l'output.
2 Viene usato un codice di uscita di 2 per indicare che si è verificato almeno un errore di test.
3 Il codice 3 di uscita indica che la sessione di test è stata interrotta. Una sessione può essere interrotta usando CTRL+C, ad esempio.
4 Il codice 4 di uscita indica che l'installazione delle estensioni usate non è valida e la sessione di test non può essere eseguita.
5 Il codice 5 di uscita indica che gli argomenti della riga di comando passati all'app di test non sono validi.
6 (non più usato) Il codice 6 di uscita non è più prodotto dalla piattaforma, ma in precedenza indicava che la sessione di test usava una funzionalità non implementata.
7 Il codice 7 di uscita indica che una sessione di test non è stata completata correttamente e probabilmente si è verificato un arresto anomalo. È possibile che ciò sia stato causato da una sessione di test eseguita tramite il punto di estensione di un controller di test.
8 Il codice 8 di uscita indica che la sessione di test non ha individuato alcun test o che ogni test selezionato è stato ignorato con il strict --zero-tests-policy.
9 Il codice 9 di uscita indica che l'esecuzione ha eseguito meno test rispetto a un valore esplicito --minimum-expected-tests richiesto, inclusi zero test.
10 Il codice 10 di uscita indica che l'adattatore di test, Testing.Platform Test Framework, MSTest, NUnit o xUnit, non è riuscito a eseguire test per un motivo di infrastruttura non correlato all'auto del test. Un caso in cui non si riesce a creare una fixture necessaria per i test.
11 Il codice 11 di uscita indica che il processo di test verrà chiuso se il processo dipendente viene chiuso.
12 Il codice 12 di uscita indica che la sessione di test non è stata in grado di eseguire perché il client non supporta alcuna delle versioni del protocollo supportate.
13 Il codice 13 di uscita indica che la sessione di test è stata arrestata a causa del raggiungimento del numero massimo di test non riusciti specificati tramite --maximum-failed-tests l'opzione della riga di comando. Per ulteriori informazioni, vedere la sezione Opzioni nei riferimenti alle opzioni CLI MTP
14 Il codice di uscita 14 indica che un collettore di copertura compatibile ha segnalato una valutazione della soglia di copertura con esito negativo.

Un valore esplicito --minimum-expected-tests sostituisce --zero-tests-policy. Senza l'opzione minima, la gestione strict zero test continua a usare il codice 8di uscita . I codici 8 di uscita e 9 rimangono distinti in modo che un minimo non soddisfatto non sia confuso con un modulo che non ha eseguito test.

Per abilitare la registrazione dettagliata e risolvere i problemi, vedere Registrazione diagnostica.

Nessun test in un'esecuzione multi-modulo

Quando dotnet test esegue diversi moduli di test, il codice di uscita 8 è un segnale per modulo, mentre il verdetto di zero test per l'intera esecuzione viene determinato una sola volta in base ai risultati aggregati. Un singolo modulo vuoto pertanto non causa il fallimento dell'intera esecuzione, anche se il modulo mantiene il proprio messaggio diagnostico Exit code: 8 nell'output. Quando non si imposta un valore minimo globale, un'esecuzione interamente saltata viene considerata come un'esecuzione con zero test, indipendentemente dal valore --zero-tests-policy per modulo. Per altre informazioni, vedere Valori minimi per l'intera esecuzione e per modulo.

Annotazioni

Questo esito di assenza di test dell'intera esecuzione richiede SDK .NET 11 o una versione successiva.

Ignora codici di uscita specifici

MTP è progettato per essere rigoroso per impostazione predefinita, ma consente la configurabilità. Di conseguenza, è possibile che gli utenti decida quali codici di uscita devono essere ignorati (verrà restituito un codice di uscita di 0 anziché il codice di uscita originale).

Per ignorare codici di uscita specifici, usare l'opzione della --ignore-exit-code riga di comando o la TESTINGPLATFORM_EXITCODE_IGNORE variabile di ambiente. Il formato valido accettato è un elenco delimitato da punti e virgola di codici di uscita da ignorare (ad esempio, --ignore-exit-code 2;3;8). Uno scenario comune consiste nel considerare che gli errori di test non devono comportare un codice di uscita diverso da zero (che corrisponde all'ignorare il codice 2di uscita).

Registrazione diagnostica

La piattaforma offre la registrazione diagnostica predefinita che consente di risolvere i problemi di esecuzione dei test. È possibile abilitare la registrazione diagnostica tramite opzioni della riga di comando o variabili di ambiente.

Opzioni della riga di comando

Le opzioni della piattaforma seguenti forniscono informazioni utili per la risoluzione dei problemi delle app di test:

  • --info
  • --diagnostic
  • --diagnostic-synchronous-write
  • --diagnostic-verbosity
  • --diagnostic-file-prefix
  • --diagnostic-output-directory

Variabili di ambiente

È anche possibile abilitare i log di diagnostica usando le variabili di ambiente:

Nome variabile di ambiente Descrzione
TESTINGPLATFORM_DIAGNOSTIC Se impostato su 1, abilita la registrazione diagnostica.
TESTINGPLATFORM_DIAGNOSTIC_VERBOSITY Definisce il livello di verbosità. I valori disponibili sono Trace, Debug, Information, Warning, Erroro Critical.
TESTINGPLATFORM_DIAGNOSTIC_OUTPUT_DIRECTORY La directory di output per la registrazione diagnostica, se non specificata, è generata nella directory predefinita TestResults.
TESTINGPLATFORM_DIAGNOSTIC_FILE_PREFIX Prefisso per il nome del file di log. Il valore predefinito produce <asm>_<tfm>_<arch>_<timestamp>.diag. Disponibile in MTP a partire dalla versione 2.3.0; il nome precedente TESTINGPLATFORM_DIAGNOSTIC_OUTPUT_FILEPREFIX continua a essere supportato per garantire la retrocompatibilità.
TESTINGPLATFORM_DIAGNOSTIC_SYNCHRONOUS_WRITE Forza il logger di file predefinito a scrivere i log in modo sincrono. Utile per le situazioni in cui non si vogliono perdere registrazioni di log (se il processo si arresta in modo anomalo). Ciò rallenta l'esecuzione del test. Disponibile in MTP a partire dalla versione 2.3.0; il nome precedente TESTINGPLATFORM_DIAGNOSTIC_FILELOGGER_SYNCHRONOUSWRITE continua a essere supportato per garantire la retrocompatibilità.

Annotazioni

Le variabili di ambiente hanno la precedenza sugli argomenti della riga di comando.

MTP scrive un file di diagnostica per ogni origine di test. Se due file ricevono lo stesso timestamp, MTP aggiunge un processo e un suffisso del contatore anziché sovrascrivere un file esistente.

Risolvere gli errori di configurazione

Microsoft.Testing.Platform.MSBuild

Di seguito sono riportati errori di configurazione comuni correlati a Microsoft.Testing.Platform.MSBuild.

errore CS8892: Il metodo 'TestingPlatformEntryPoint.Main(string[])' non verrà usato come punto di ingresso perché è stato trovato un punto di ingresso sincrono 'Program.Main(string[])'

Definire manualmente un punto di ingresso (Main) in un progetto di test o fare riferimento a un progetto di test da un'applicazione che ha già un punto di ingresso genera un conflitto con il punto di ingresso generato da MTP. Per evitare questo problema, eseguire una di queste operazioni:

  • Rimuovere il punto di ingresso definito manualmente, in genere Main metodo in Program.cse consentire alla piattaforma di test di generarne uno automaticamente.

  • Disabilitare la generazione del punto di ingresso impostando la proprietà <GenerateTestingPlatformEntryPoint>false</GenerateTestingPlatformEntryPoint> MSBuild.

  • Disabilitare completamente la dipendenza transitiva per Microsoft.Testing.Platform.MSBuild impostando la proprietà <IsTestingPlatformApplication>false</IsTestingPlatformApplication> MSBuild nel progetto che fa riferimento a un progetto di test. Questa operazione è necessaria quando si fa riferimento a un progetto di test da un progetto non di test, ad esempio un'app console che fa riferimento a un'applicazione di test.

Lo spazio dei nomi del codice generato è in conflitto con un tipo referenziato

Microsoft.Testing.Platform.MSBuild genera i tipi SelfRegisteredExtensions e TestingPlatformEntryPoint all'interno del $(RootNamespace) del progetto. Per impostazione predefinita, RootNamespace corrisponde al nome del progetto, che può essere in conflitto con un tipo dello stesso nome completo esposto da un assembly a cui si fa riferimento.

Ad esempio, un progetto chiamato System.Security.Cryptography.ProtectedData.Tests finisce per generare codice nel namespace System.Security.Cryptography.ProtectedData. Se il progetto fa riferimento anche al System.Security.Cryptography.ProtectedData pacchetto NuGet, che contiene un tipo pubblico ProtectedData nello System.Security.Cryptography spazio dei nomi, il compilatore non può più disambiguare tra lo spazio dei nomi generato e il tipo a cui viene fatto riferimento e genera errori come CS0118 ("ProtectedData" è uno spazio dei nomi ma viene usato come un tipo").

Per risolvere il conflitto, eseguire l'override RootNamespace nel progetto di test su un valore che non si scontra con alcun tipo a cui si fa riferimento:

<PropertyGroup>
  <RootNamespace>System.Security.Cryptography.ProtectedDataTests</RootNamespace>
</PropertyGroup>

È anche possibile lasciare RootNamespace interamente vuoto (<RootNamespace />); in tal caso, i tipi generati vengono emessi nello spazio dei nomi globale.

Microsoft.Testing.Extensions.Fakes

Errore di Fakes: Impossibile risolvere il percorso del profiler dalle variabili di ambiente COR_PROFILER_PATH e COR_PROFILER

Questo errore può verificarsi se non tutti gli assembly Fakes sono presenti nella cartella bin.

  • Assicurarsi che il progetto usi il MSTest.SDK o faccia riferimento a Microsoft.Testing.Extensions.Fakes.
  • Per i progetti di .NET Framework, evitare di impostare <PlatformTarget>AnyCPU</PlatformTarget> perché in questo modo NuGet non copia tutti i file nella cartella bin.

Opzione della riga di comando dell'estensione non riconosciuta

Un'opzione della riga di comando specifica per l'estensione può avere esito negativo con il codice di uscita 5 quando un'applicazione di test non registra il pacchetto che fornisce tale opzione. Ad esempio, --report-trx richiede Microsoft.Testing.Extensions.TrxReport, come riferimento diretto al pacchetto o tramite una configurazione o un profilo dell'SDK di test che include il pacchetto. Il core di MTP non comprende report, copertura del codice, dump, nuovi tentativi o altre opzioni di estensione.

Eseguire l'applicazione di test con --helpo eseguire dotnet test --help in modalità MTP per verificare che l'opzione sia disponibile. Se l'opzione manca, aggiungere il pacchetto di estensione o abilitare l'estensione tramite l'SDK di test. Per trovare il pacchetto necessario, vedere Opzioni di estensione per scenario .

Lo stesso errore si verifica quando una soluzione contiene progetti che usano framework di test diversi (ad esempio, MSTest e xUnit.net) o diversi set di estensioni (ad esempio, solo alcuni progetti fanno riferimento Microsoft.Testing.Extensions.HangDump). L'opzione è valida per un progetto ma non riconosciuta da un altro.

Per risolvere questo problema, usare la TestingPlatformCommandLineArguments proprietà MSBuild con condizioni per instradare gli argomenti ai progetti corretti. Per istruzioni dettagliate, vedere Soluzioni con framework di test misti o estensioni.