introduction du nez – Test Python

By | avril 12, 2019

trouver un expert Python

Cet article contient plusieurs exemples et couvre les montages, la découverte de tests, les assertions, les options en cours d'exécution et l'exécution d'unittests et de doctests.

Le slogan de Nose est «le nez s’allonge pour faciliter le test».
C’est un framework de test unitaire python assez bien connu, qui peut exécuter des tests de type test, test unittest et test «pas de passe-partout».

C'est un bon candidat pour un framework de test Go-to.

Je pense qu'un développeur intelligent devrait maîtriser le doctest, le unittest, le pytest et le nez. Ensuite, décidez si l’un de ceux-ci est le plus logique pour eux, ou s'ils souhaitent continuer à rechercher des fonctionnalités que l’on ne trouve que dans d’autres frameworks.
C’est bien sûr la raison pour laquelle j’écris cette série. Donc, je suppose que ce dernier point va sans dire.

Contenu

Pas de passe-partout, quelques api

Un fichier de test de base pour nose est assez simple, sans code passe-partout, sans classes obligatoires, sans importations inutiles et sans aucune API supplémentaire.

Ceci est identique au test simple présenté dans mon intro pytest.
Il existe des différences entre la manière dont vous devez écrire vos tests pour les deux frameworks une fois que vous avez intégré des fonctionnalités supplémentaires, telles que les fixtures, les plugins, les mécanismes d'assertion, etc.
Je vais laisser une comparaison complète du pytest et du nez à un futur post.

Pourquoi est-ce que je dis «quelque api»? Eh bien, lorsque vous arrivez dans les installations (comme l'installation / le démontage, etc.), il y a une api de nez qui est nécessaire dans les tests. Je vais entrer dans cela dans la section des appareils.

Exemple de nez

Pour être complet en suivant les styles des précédentes introductions du framework, voici le test de base complet.
Cela ne diffère de ce qui précède que j’ai ajouté une autre fonction de test.

Nez qui coule

Pour courir le nez, utilisez le nosetests commande qui vient avec le nez.

Et avec verbeux:

Voici un exemple exécuté avec et sans verbose:

Fixations de nez

Nose étend le modèle de montage le plus simple d'installation / de démontage.

Nous pouvons ajouter du code spécifique pour exécuter:

  • au début et à la fin d'un module de code de test (setup_module / teardown_module)
    Pour que cela fonctionne, il vous suffit d'utiliser les bonnes règles de nommage.
  • au début et à la fin d'une classe de méthodes de test (setup_class / teardown_class)
    Pour que cela fonctionne, vous devez utiliser les bonnes règles de nommage et inclure le décorateur ‘@classmethod’.

  • avant et après un appel de fonction test (setup_function / teardown_function)
    Vous pouvez utiliser n'importe quel nom. Vous devez les appliquer avec le décorateur ‘@with_setup’ importé du nez.
    Vous pouvez également utiliser l'affectation directe, ce que je vais montrer dans l'exemple.

  • avant et après un appel de méthode de test (configuration / démontage)
    Pour que cela fonctionne, vous devez utiliser le bon nom.

Les appareils les plus faciles à ajouter sont:

  • setup_module () fonction: s'exécute avant tout le reste du fichier
  • teardown_module () fonction: s'exécute après tout le reste du fichier

Et si vous utilisez une classe pour définir des tests:

  • installer() méthode: s'exécute avant chaque méthode de test
  • abattre() méthode: fonctionne après chaque méthode de test

Vous pouvez également définir des fonctions de test non basées sur la classe pour que le paramétrage / démontage
fonctions, mais vous devez importer le décorateur ‘with_setup’ du nez, comme suit:

from nose import with_setup # optionnel

Si vous n'aimez pas utiliser les décorateurs, vous pouvez également attribuer les attributs de configuration et de démontage comme suit:

Cependant, je pense que c’est un peu gênant.

Avec les classes, vous pouvez définir une configuration / un démontage pour la classe, mais vous le faites différemment.
Vous devez vous assurer que les méthodes sont des méthodes de classe utilisant le décorateur ‘classmethod’, et nommez-les correctement, comme suit:

Cela fonctionne, c’est juste que vous devez garder la syntaxe exacte pour toutes les règles différentes pour différents appareils.

Ici, ils sont tous ensemble.

Pour le voir en action, je vais utiliser le -s option, qui désactive la capture de sortie.
Cela montrera l'ordre des différents appels de fixture.

Test de markdown.py

Ceci est également identique au code pouvant être exécuté à partir de py.test.
C’est similaire au code unittest, mais sans passe-partout, et avec de simples appels d’assertion au lieu d’assertEquals.
Encore une fois, j’utilise l’adaptateur d’API pour appeler proprement la fonctionnalité de démarquage.

Voici le code pour utiliser nose pour tester markdown.py:

Et voici la sortie:

Tous les tests échouent.
Bien que les numéros de ligne des échecs, ainsi que les noms des fonctions de test, soient imprimés, le rapport n’indique pas vraiment ce qui ne va pas.

Nez assert_equals

Si nous utilisons beaucoup de affirmer quelque chose == quelque choseElse tests de type, et nous nous sommes engagés à utiliser le nez pour les tests, nous pouvons utiliser des outils de nez pour rendre le rapport un peu évident sur la nature de l’échec.

Je vais réécrire les tests ci-dessus en utilisant nose.tools.assert_equals:

Nose’s assert_equals fonctionne beaucoup comme assertEquals de unittest.

Regardons maintenant le résultat:

Maintenant, la sortie rend plus évident ce qui ne va pas.

Test de découverte

J'utilise les mêmes conventions d'appellation pour le nez que pour py.test.

  • Nommez mes modules / fichiers de test en commençant par «test_».
  • Nommez mes fonctions de test en commençant par «test_».
  • Nommez mes classes de test en commençant par 'Test'.
  • Nommez mes méthodes de test en commençant par 'test_'.
  • Assurez-vous que tous les paquets avec le code de test ont un ‘initfichier .py ’.

Ces règles fonctionnent très bien pour moi.

Ce n'est pas la liste complète des règles. Si vous voulez faire quelque chose de différent, consultez la documentation du nez pour trouver des tests.

Courir unittest du nez

Nose trouve et exécute des tests sans aucun problème et sans étapes supplémentaires.
Ici, je vais lancer les tests depuis l’intro unittest:

Traverser les docteurs du nez

Nose peut exécuter des doctests, soi-disant.
Cependant, je ne pouvais pas le faire fonctionner sur des doctests dans une méthode de fichier séparée, en utilisant test_unnecessary_math.txt.

J'ai essayé plusieurs des options, sans succès.
Si vous savez ce que je fais mal, s'il vous plaît faites le moi savoir.

Plus d'infos sur le nez (liens)

Exemples sur github

Tous les exemples ici sont disponibles dans le projet markdown.py sur github.