Come faccio a saltare i test specifici in xUnit basati su piattaforma corrente

StackOverflow https://stackoverflow.com/questions/4421328

  •  09-10-2019
  •  | 
  •  

Domanda

  • Ho un assembly che ho costruito su Windows
  • Voglio correre i test xUnit su Mono in Linux.

Tuttavia, ho scoperto che, mentre 400 di questi test può essere eseguito (in ordine), che alcuni test o appendere il corridore xUnit, o abbatterlo del tutto.

Non mi cura se alcuni test non sono in grado di girare su Linux, alcuni test sono a che fare con il DTC e alcuni gumph non gestito che non abbiamo bisogno di sostenere lì.

Quello che voglio però, è quello di applicare un ignore a quei test, e hanno il fatto che il test è stato ignorato segnalato correttamente nel output di generazione.

La domanda può essere riassunta in Credo che un certo numero di soluzioni possibili

  • Come faccio a eseguire test specifici in xUnit tramite il corridore della console? (Non ho trovato la documentazione a tal fine, forse sto solo non guardare abbastanza duro)
  • E 'possibile andare dall'altra parte e dire "Ecco un assieme, si prega di ignorare questi test specifici anche se"
  • Avere un attributo su tali test è stato suggerito un modo migliore, per documentare formalmente che questi test sono specifici della piattaforma -? È possibile questo

Se potessi evitare di modificare il codice originale troppo che sarebbe stato grande, come il codice non è veramente mio al cambiamento, e l'applicazione di un sacco di hack cross-platform, probabilmente non andrà giù troppo bene.

È stato utile?

Soluzione

I eviterebbe esternalizzazione test saltare (vale a dire un config file / comando, se è possibile). Questo va un po 'contro il fare i test facile da gestire e affidabile. Fare le prove ignorate nel codice è l'approccio più sicuro quando le altre persone iniziano a mettersi in gioco.

ho potuto vedere una serie di opzioni, qui ci sono due che coinvolgono la modifica del codice esistente.

Opzione 1 - Le più invadente, piattaforma momento della compilazione di rilevamento

Nella soluzione VS, definire un'altra configurazione che definisce un MONOWIN precompilatore bandiera (solo in modo che sia in modo esplicito una bandiera l'dice che è per il codice compilato su Windows per l'utilizzo su Mono).

quindi definire un attributo che farà il test ignorato quando viene compilato per Mono:

public class IgnoreOnMonoFactAttribute : FactAttribute {
#if MONOWIN
    public IgnoreOnMonoFactAttribute() {
        Skip = "Ignored on Mono";
    }
#endif
}

In realtà è difficile trovare alcun vantaggio a questo metodo in quanto comporta beffardo con la soluzione originale e aggiunge un altro confiration che ha bisogno di essere supportato.

Opzione 2 - un po 'invadente - piattaforma di runtime rilevamento

Ecco una soluzione simile a opzione1, tranne che non è necessaria alcuna configurazione separata:

public class IgnoreOnMonoFactAttribute : FactAttribute {

    public IgnoreOnMonoFactAttribute() {
        if(IsRunningOnMono()) {
            Skip = "Ignored on Mono";
        }
    }
    /// <summary>
    /// Determine if runtime is Mono.
    /// Taken from http://stackoverflow.com/questions/721161
    /// </summary>
    /// <returns>True if being executed in Mono, false otherwise.</returns>
    public static bool IsRunningOnMono() {
        return Type.GetType("Mono.Runtime") != null;
    }
}

Nota 1

xUnit corridore verrà eseguito un metodo due volte se si è contrassegnato con [Fact] e [IgnoreOnMonoFact]. (CodeRush non lo fa, in questo caso suppongo xUnit è corretto). Ciò significa che i metodi ogni test devono avere [Fact] sostituiti con [IgnoreOnMonoFact]

Nota 2

CodeRush prova corridore ancora eseguito il test di [IgnoreOnMonoFact], ma lo ha fatto ignorare il test di [Fact(Skip="reason")]. Suppongo che sia dovuto CodeRush riflettente xUnit e non di eseguirlo con l'ausilio di librerie xUnit. Questo funziona bene con xUnit corridore.

Altri suggerimenti

xUnit v2.0 è ora disponibile. test ignorabili sono supportati da direttamente. Usa:

[Fact (Skip = "specific reason")]

C'è una nuove opzioni ora.

Aggiungi Nuget pacchetto SkippableFact , che consente di utilizzare al posto di [SkippableFact] [Fact] e è possibile utilizzare Skip.<xyz> nel giro di prove per dinamicamente saltare il test durante il runtime.

Esempio:

[SkippableFact]
public void SomeTestForWindowsOnly()
{
    Skip.IfNot(Environment.IsWindows);

    // Test Windows only functionality.
}

Si tratterebbe di un utilizzo ideale di tratti, ma purtroppo, né la linea di comando, né i supporti di file di progetto XML filtraggio sulla base di tratti. Sarebbe la pena di aggiungere un problema al sito CodePlex per questo.

Questo è ora risolto in 1.8 - è possibile filtrare su Tratti. Vedere questo problema registro .

Aggiornamento:. Tratti lavoro con il corridore della console, ma non MSBuild, Ho una richiesta di funzionalità per il sostegno

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top