introduction à pytest – Test Python

By | août 9, 2019

python pour débutant

Je pense à pytest comme le run-n'importe quoi, pas de passe-partout, pas d'api requise, utilisez-ce-que-si-vous-avez-une-raison-non-à-tester.
C’est vraiment là que les tests s’amusent.
Comme pour les précédentes introductions sur ce site, je vais passer en revue une vue d’ensemble, puis un exemple simple, puis jetter pytest dans mon projet markdown.py. Je couvrirai également les appareils, la découverte de test et l’exécution de tests avec pytest.

Contenu

Pas de passe-partout, pas d'api requise

Le doctest
et unittest viennent tous les deux avec Python.
Ils sont assez puissants en eux-mêmes, et je pense que vous devriez au moins connaître ces frameworks et apprendre à les utiliser au moins sur quelques exemples de jouets, car cela vous donne un framework mental pour visualiser d'autres frameworks de test.

Avec unittest, un fichier de test très basique pourrait ressembler à ceci:

Le style de dériver de unittest.TestCase est quelque chose qui partage le moins avec ses homologues xUnit comme JUnit.

Je ne veux pas entrer dans l’histoire des frameworks de style xUnit. Cependant, il est instructif de savoir que l’héritage est très important dans certaines langues pour que le cadre de test fonctionne correctement.

Mais c'est Python. Nous avons des capacités d’introspection et d’exécution très puissantes et très peu d’informations dissimulées. Pytest en profite.

Un test identique à celui ci-dessus pourrait ressembler à ceci si nous retirons le passe-partout:

Oui, trois lignes de code. (Quatre, si vous incluez la ligne vide.)
Il n'y a pas besoin de importer non négligeable.
Il n'y a pas besoin de dériver de Cas de test.
Il n'y a pas besoin de spécial self.assertEqual (), puisque nous pouvons utiliser la version intégrée de Python affirmer déclaration.

Cela fonctionne dans pytest. Une fois que vous commencez à écrire de tels tests, vous ne voudrez plus revenir en arrière.

Cependant, vous pouvez déjà avoir un tas de tests écrits pour doctest ou unittest.
Pytest peut être utilisé pour exécuter des doctestes et des unittests.
Il prétend également supporter certains tests d’essais tordus (bien que je n’aie pas essayé cela).

Vous pouvez étendre pytest en utilisant les plugins que vous extrayez du Web ou écrire vous-même.
Je ne vais pas couvrir les plugins dans cet article, mais je suis sûr d’y revenir dans un prochain article.

Vous verrez parfois pytest appelé py.test.
J'utilise cette convention:
pytest: le projet
py.test: l'outil en ligne de commande qui exécute pytest
Je ne suis pas sûr que ce soit tout à fait exact selon la façon dont les gens de pytest.org utilisent les termes.

exemple pytest

En utilisant le même module inutile_math.py que j'ai écrit dans le
docto intro,
Voici un exemple de code de test permettant de tester la fonction «multiplier».

Course à pied

Pour exécuter pytest, les deux appels suivants sont identiques:

Et avec verbose:

Je vais utiliser py.test, car il est plus court à taper.

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

luminaires pytest

Même si unittest nous permet d’avoir la configuration et le démontage, pytest le prolonge un peu.
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)
  • au début et à la fin d'une classe de méthodes de test (setup_class / teardown_class)
  • autre style des projecteurs de niveau classe (installation / démontage)
  • avant et après un appel de fonction test (setup_function / teardown_function)
  • avant et après un appel de méthode de test (setup_method / teardown_method)

Nous pouvons également utiliser des luminaires de style pytest, recouverts d'écrous et de boulons de luminaires pytest.

J’ai modifié notre code de test simple avec des appels de fixture et ajouté quelques instructions print afin que nous puissions voir ce qui se passe.
Voici le code:

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

Le code de test pour tester markdown.py ressemblera beaucoup à la version la plus simple, mais sans le passe-partout.
J'utilise également un adaptateur API introduit dans un précédent post.
Voici le code pour utiliser pytest pour tester markdown.py:

Et voici la sortie:

Vous remarquerez qu'ils échouent tous. C’est exprès, car je n’ai encore implémenté aucun code de démarcation réel.
Cependant, le formatage de la sortie est assez agréable.
C’est assez facile de voir pourquoi le test échoue.

Test de découverte

Le module unittest est livré avec une option "découverte".
Discovery est juste construit pour pytest.
La découverte de test a été utilisée dans mes exemples pour rechercher des tests dans un module spécifié.
Cependant, pytest peut trouver des tests résidant dans plusieurs modules et packages, et même trouver des tests et des doctests.
Pour être honnête, je n’ai pas mémorisé les règles de découverte.
J'essaie juste de faire cela, et à semble fonctionner correctement:

  • 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 uninitfichier .py ’.

Si je fais tout cela, pytest semble bien trouver tout mon code.
Si vous faites autre chose et que vous ne parvenez pas à obtenir le code de test pytest,
jetez ensuite un coup d’œil à la documentation de découverte de pytest.

Exécuter unittests de Pytest

Pour montrer comment pytest gère les unittests, voici un exemple de test sur les simples tests que j’ai écrits dans son introduction:

Comme vous pouvez le constater, je n’ai fourni aucune option supplémentaire, pytest détecte automatiquement l’analyse des désistements.

Exécuter des doctests de Pytest

Selon la documentation, vous pouvez exécuter certains doctests à partir de pytest.
Cependant, avec mes exemples de mise en place de doctests dans des fichiers texte, je ne peux pas trouver un moyen de faire fonctionner pytest.

J’ai essayé plusieurs fois et je continue à avoir des problèmes d’importation:

Si quelqu'un sait ce que je ne fais pas bien, faites-le-moi savoir.
Merci d'avance.

Plus d'infos sur pytest (liens)

Exemples sur github

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

Prochain

Dans le prochain post, je vais mettre le nez au problème de l’espace.