Nunit: Comment extraire une liste de cas de test et leurs catégories par programmation.

Créé le 27 août 2020  ·  3Commentaires  ·  Source: nunit/nunit

Bonjour les gens,

C'est une question.

J'essaie d'obtenir une liste de tous les cas de test et de leurs catégories respectives.

Actuellement, je vois trois options :
1) Réflexion : en parcourant toutes les méthodes, vérifiez TestAttribute/TestCaseAttribute/TestFixture...

2) À l'aide d'un runner, extrayez le xml avec runner.Explorez et analysez le xml.

3) Utilisez ce que NUnit fait déjà.

Ma question tourne autour de ce dernier :
Comment « aplatir » les catégories pour chaque cas de test ? (lorsque les catégories sont mises sur la classe abstraite ou la classe entière)
Idéalement, je voudrais réutiliser ce qui est déjà utilisé dans NUnit pour extraire sa liste de tests.
Une suggestion pour savoir par où commencer la lecture ?

Meilleures salutations,
Simon

Commentaire le plus utile

Salut,
J'ai récemment passé du temps à essayer d'accomplir la même chose et j'ai essayé quelques choses avant de choisir ma solution actuelle (qui peut ou non fonctionner pour vous). J'avais besoin d'une solution à usage assez général qui fonctionnerait pour différents projets de test nunit3 (certains ciblant le framework dotnet et d'autres ciblant le noyau dotnet). Au départ, j'ai essayé la réflexion et le chargement de l'assembly, et j'ai invoqué le BuildFrom() partir de l'interface ITestBuilder . Cela a fonctionné pour la plupart des projets, mais pas pour tous, et cela m'a semblé beaucoup de travail et je préférerais laisser NUnit faire le gros du travail.

Ensuite, j'ai essayé l' API du moteur NUnit (

En fin de compte, j'ai réalisé que ce serait bien si ma solution fonctionnait également pour des solutions de test utilisant d'autres frameworks de tests unitaires. J'ai donc créé un enregistreur de test vstest personnalisé que j'utilise avec le nunit3testadapter. L'enregistreur personnalisé définit les gestionnaires d'événements pour les événements DiscoveredTests et DiscoveryComplete . L'enregistreur sérialise la liste des objets de test découverts dans un fichier json que je traite ensuite ailleurs. Pour utiliser l'enregistreur, j'exécute la console vstest, en fournissant le commutateur /ListTests afin que seule la découverte de test soit exécutée, et une autre option pour utiliser l'enregistreur personnalisé : vstest.console.exe <testassemblypath> /ListTests /Logger:<customloggername> -- RunConfiguration.TestAdaptersPaths=<directoryofcustomlogger>;<directoryofnunitadapter> (notez qu'il y a un espace après le double tirets). Ajoutez simplement une référence à Microsoft.TestPlatform.TranslationLayer car cela vous donne accès à la fois au modèle d'objet vstest et au JsonDataSerializer pour sérialiser/désérialiser les données de cas de test découvertes. Je pense que vous avez besoin d'au moins la v16 du package translationlayer car elle est compatible avec la version de la plate-forme qui a introduit les événements de découverte de test. Vous pouvez télécharger vstest depuis nuget ou vous l'aurez déjà si vous avez installé Visual Studio 2019.

Une autre alternative pourrait être d'utiliser vstest.console.exe et le NUnit3Adapter, et d'activer le paramètre d' adaptateur vstest.console.exe <testassemblypath> /ListTests -- NUnit.DumpXmlTestDiscovery=True .

Cette solution est peut-être un peu exagérée pour vos besoins, mais elle n'a finalement pas été beaucoup de code. Il suffit que les consommateurs utilisent vstest version 16 ou supérieure. Je ne me souviens pas par cœur, mais je pense que les catégories étaient « aplaties ».

Les références:

[modifier] a mis à jour l'exemple d'utilisation - j'avais inclus la propriété runconfiguration incorrecte

Tous les 3 commentaires

Salut,
J'ai récemment passé du temps à essayer d'accomplir la même chose et j'ai essayé quelques choses avant de choisir ma solution actuelle (qui peut ou non fonctionner pour vous). J'avais besoin d'une solution à usage assez général qui fonctionnerait pour différents projets de test nunit3 (certains ciblant le framework dotnet et d'autres ciblant le noyau dotnet). Au départ, j'ai essayé la réflexion et le chargement de l'assembly, et j'ai invoqué le BuildFrom() partir de l'interface ITestBuilder . Cela a fonctionné pour la plupart des projets, mais pas pour tous, et cela m'a semblé beaucoup de travail et je préférerais laisser NUnit faire le gros du travail.

Ensuite, j'ai essayé l' API du moteur NUnit (

En fin de compte, j'ai réalisé que ce serait bien si ma solution fonctionnait également pour des solutions de test utilisant d'autres frameworks de tests unitaires. J'ai donc créé un enregistreur de test vstest personnalisé que j'utilise avec le nunit3testadapter. L'enregistreur personnalisé définit les gestionnaires d'événements pour les événements DiscoveredTests et DiscoveryComplete . L'enregistreur sérialise la liste des objets de test découverts dans un fichier json que je traite ensuite ailleurs. Pour utiliser l'enregistreur, j'exécute la console vstest, en fournissant le commutateur /ListTests afin que seule la découverte de test soit exécutée, et une autre option pour utiliser l'enregistreur personnalisé : vstest.console.exe <testassemblypath> /ListTests /Logger:<customloggername> -- RunConfiguration.TestAdaptersPaths=<directoryofcustomlogger>;<directoryofnunitadapter> (notez qu'il y a un espace après le double tirets). Ajoutez simplement une référence à Microsoft.TestPlatform.TranslationLayer car cela vous donne accès à la fois au modèle d'objet vstest et au JsonDataSerializer pour sérialiser/désérialiser les données de cas de test découvertes. Je pense que vous avez besoin d'au moins la v16 du package translationlayer car elle est compatible avec la version de la plate-forme qui a introduit les événements de découverte de test. Vous pouvez télécharger vstest depuis nuget ou vous l'aurez déjà si vous avez installé Visual Studio 2019.

Une autre alternative pourrait être d'utiliser vstest.console.exe et le NUnit3Adapter, et d'activer le paramètre d' adaptateur vstest.console.exe <testassemblypath> /ListTests -- NUnit.DumpXmlTestDiscovery=True .

Cette solution est peut-être un peu exagérée pour vos besoins, mais elle n'a finalement pas été beaucoup de code. Il suffit que les consommateurs utilisent vstest version 16 ou supérieure. Je ne me souviens pas par cœur, mais je pense que les catégories étaient « aplaties ».

Les références:

[modifier] a mis à jour l'exemple d'utilisation - j'avais inclus la propriété runconfiguration incorrecte

Le Xml de DumpXmlTestDiscovery pour la sortie de test elle-même (!) provient directement du moteur NUnit et n'est pas susceptible de changer en soi. Il s'agit des mêmes informations XML que celles utilisées par l'adaptateur, donc tout changement nécessiterait un nouvel adaptateur et romprait la compatibilité descendante, ce à quoi nous sommes très attentifs. Cependant, le fichier en lui - même

Bonjour @shack05 et @OsirisTerje ,

Merci beaucoup pour vos éclairages !

Pour récapituler toutes les solutions :

1) Réflexion :
Assembly x = Assembly.GetExecutingAssembly();
var classes = x.GetExportedTypes();

        foreach (System.Type type in classes)
        {
            MethodInfo[] methods = type.GetMethods();
            foreach (MethodInfo methodInfo in methods)
            {
                if ((methodInfo.GetCustomAttributes(typeof(TestAttribute), true).Length == 1)

...

2) API du moteur NUnit :

Moteur ITestEngine = TestEngineActivator.CreateInstance();

        // Create a simple test package - one assembly, no special settings
        TestPackage package = new NUnit.Engine.TestPackage(Assembly.GetExecutingAssembly().Location);

        // Get a runner for the test package
        ITestRunner runner = engine.GetRunner(package);

        var tree = runner.Explore(NUnit.Engine.TestFilter.Empty);//new NUnit.Engine.TestFilter("*"));

3) Consoles (soit NUnit ou vstest) :
nunit3-console.exe Tests.dll --explore:"nunit3-test.xml" --where="{testFilter}"

Je vais probablement finir par mixer 1 et 3.

Cette page vous a été utile?
0 / 5 - 0 notes