web-dev-qa-db-fra.com

Comment ignorer des tests spécifiques dans xUnit en fonction de la plate-forme actuelle

  • J'ai un assemblage que j'ai construit sur Windows
  • Je veux exécuter les tests xUnit sur mono sous Linux.

Cependant, j'ai trouvé que même si 400 de ces tests peuvent être exécutés (dans l'ordre), certains tests peuvent soit bloquer le runner xUnit, soit le désactiver complètement.

Je ne attention si certains tests ne peuvent pas s'exécuter sur Linux, certains tests sont à faire avec le DTC et certains gumph non gérés que nous n'avons pas besoin de prendre en charge là-bas.

Ce que je veux cependant, c'est appliquer un ignorer à ces tests, et avoir le fait que le test a été ignoré marqué correctement dans la sortie de la construction.

La question peut se résumer à, je suppose, un certain nombre de solutions possibles

  • Comment exécuter des tests spécifiques dans xUnit via le runner de console? (Je n'ai pas trouvé de documentation à cette fin, peut-être que je ne cherche pas assez fort)
  • Est-il possible d'aller dans l'autre sens et de dire "Voici un assemblage, veuillez ignorer ces tests spécifiques"
  • Avoir un attribut sur ces tests a été suggéré comme une meilleure façon de documenter formellement que ces tests sont spécifiques à la plate-forme - est-ce possible?

Si je pouvais éviter de trop modifier le code d'origine, ce serait génial, car le code n'est pas vraiment le mien à changer, et appliquer beaucoup de hacks multiplateformes ne descendra probablement pas trop bien.

42
Rob Ashton

J'éviterais d'externaliser les tests de saut (c'est-à-dire un fichier de configuration/commande si c'est possible). Cela va un peu à l'encontre de rendre les tests faciles à exécuter et fiables. Ignorer les tests dans le code est l'approche la plus sûre lorsque d'autres personnes commencent à s'impliquer.

Je pourrais voir un certain nombre d'options, voici deux qui impliquent la modification du code existant.

Option 1 - Détection la plus intrusive de la plateforme de compilation

Dans la solution VS, définissez une autre configuration qui définit un indicateur de précompilateur MONOWIN (juste pour que ce soit explicitement un indicateur qui indique qu'il s'agit d'un code compilé sur Windows pour une utilisation sur Mono).

Définissez ensuite un attribut qui rendra le test ignoré lors de la compilation pour Mono:

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

Il est en fait difficile de trouver des avantages à cette méthode car elle implique de se moquer de la solution d'origine et ajoute une autre confiration qui doit être prise en charge.

Option 2 - quelque peu intrusive - détection de plate-forme d'exécution

Voici une solution similaire à l'option 1, sauf qu'aucune configuration distincte n'est requise:

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;
    }
}

Note 1

xUnit runner exécutera une méthode deux fois si elle est marquée avec [Fact] et [IgnoreOnMonoFact]. (CodeRush ne fait pas cela, dans ce cas, je suppose que xUnit est correct). Cela signifie que toutes les méthodes de test doivent avoir [Fact] Remplacé par [IgnoreOnMonoFact]

Note 2

Le lanceur de test CodeRush a toujours exécuté le test [IgnoreOnMonoFact], Mais il n'a pas ignoré le test [Fact(Skip="reason")]. Je suppose que cela est dû au fait que CodeRush reflète xUnit et ne l'exécute pas réellement à l'aide des bibliothèques xUnit. Cela fonctionne très bien avec le runner xUnit.

35
Igor Zevaka

XUnit v2.0 est maintenant disponible. Les tests désactivables sont directement pris en charge par celui-ci. Utilisation:

[Fact (Skip = "specific reason")]

54
richardwhatever

Il y a maintenant de nouvelles options.

Ajouter un package Nuget SkippableFact , qui vous permet d'utiliser [SkippableFact] au lieu de [Fact] et vous pouvez utiliser Skip.<xyz> dans un test pour ignorer dynamiquement le test pendant l'exécution.

Exemple:

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

    // Test Windows only functionality.
}
26

Ceci est maintenant résolu en 1.8 - vous pouvez filtrer les Traits. Voir ceci journal des problèmes .

Mise à jour: les traits fonctionnent avec le runner de la console mais pas avec MSBuild, j'ai ajouté une demande de fonctionnalité pour ce support.

2
hoserdude

Ce serait une utilisation idéale des traits, mais malheureusement, ni la ligne de commande ni le fichier de projet xml ne prennent en charge le filtrage basé sur les traits. Cela vaudrait la peine d'ajouter un problème au site codeplex pour cela.

2
citizenmatt