Plus loin 
Les tests de logiciels systématiques, en particulier dans la communauté Python, sont souvent complètement ignorés ou effectués d'une manière spéciale. De nombreux programmeurs Python ignorent totalement l'existence de pytest. Brian Ocken prend la peine de prouver que tester un logiciel avec pytest est simple, naturel et même intéressant.
Dmitry Zinoviev
Auteur de Data Science Essentials in Python

Les exemples de ce livre sont écrits en utilisant Python 3.6 et pytest 3.2. pytest 3.2 prend en charge Python 2.6, 2.7 et Python 3.3+.
Le code source du projet Tâches, ainsi que pour tous les tests présentés dans ce livre, est disponible sur le lien sur la page Web du livre à pragprog.com . Vous n'avez pas besoin de télécharger le code source pour comprendre le code de test; le code de test est présenté sous une forme pratique dans les exemples. Mais pour suivre les tâches du projet ou adapter des exemples de test pour tester votre propre projet (vos mains ne sont pas liées!), Vous devez vous rendre sur la page Web du livre et télécharger le travail. Là, sur la page Web du livre, il y a un lien pour les messages d' erreur et un forum de discussion .
Sous le spoiler se trouve une liste d'articles de cette série.
Remerciements
Je dois d'abord remercier Michelle - ma femme et ma meilleure amie. Dommage que vous ne voyiez pas la pièce dans laquelle j'écris. Au lieu d'une table, j'ai une table à manger carrée en chêne antique sur laquelle il y a assez d'espace pour que le papier soit disposé. Une belle bibliothèque en verre avec mes jouets spatiaux rétro que nous avons collectionnés au fil des années, ainsi que des livres techniques, des circuits imprimés et des balles de jonglage. Boîtes en aluminium antiques pour stocker le papier vers le haut remplies de notes, de cordons et même des autocollants restants pour les fusées. Un mur est recouvert de velours, que nous avons acheté il y a de nombreuses années, lorsque le magasin de tissus a décidé de fermer définitivement. Le tissu devrait calmer l'écho lorsque j'enregistre des podcasts.
J'aime écrire ici non seulement parce que c'est pratique et cohérent avec mon monde intérieur, mais aussi parce que c'est l'espace que Michel a créé avec moi et pour moi. Elle et moi avons toujours été une équipe, et elle a incroyablement soutenu mes idées folles pour écrire un blog, démarrer un podcast ou deux, et maintenant, au cours de la dernière année, écrire ce livre. Elle s'est assurée que j'avais le temps et l'espace pour écrire. Quand je suis fatiguée et que je me demande si j'ai encore la force d'écrire, elle me propose de continuer pendant vingt minutes et de regarder comment je me sentirai alors, elle a fait de même lorsqu'elle m'a aidé à traverser la dernière soirées universitaires. Je n'aurais vraiment pas pu le faire sans elle.
J'ai aussi deux filles étonnamment étonnantes, curieuses et brillantes, Gabriella et Sofia, qui sont deux de mes plus grandes fans. Ella propose à tous ceux qui parlent de programmation d'écouter mes podcasts, et Phia a affiché un autocollant pour le code de test sur son sac à dos, qu'elle a pris en deuxième année.
Il y a tellement plus de personnes à remercier.
Mon éditeur, Katherine Dvorak, m'a aidé à rassembler un tas d'idées et de sujets aléatoires dans une progression cohérente, et c'est la raison pour laquelle il s'agit d'un livre, pas d'une série de billets de blog réunis. Je me suis lancée dans ce projet en tant que blogueuse et je me suis trop attachée aux nombreux titres, sous-titres et éléments de liste, et Katie m'a patiemment guidé pour que je puisse devenir un meilleur écrivain.
Merci à Suzanne Davidson Palatinate, Andy Hunt et au reste de Pragmatic Bookshelf de m'avoir donné une chance.
Les critiques techniques m'ont gardé honnête dans pytest, mais aussi dans le style Python, et sont la raison pour laquelle les exemples de code suivent PEP 8. Merci à Oliver Bestwalter, Florian Bruhin, Floris Bruinog, Mark Goody, Peter Hampton, Dave Hunt, Al Crinker, Lokesh Kumaru Makani, Bruno Oliveira, Ronnie Pfannschmidt, Rafael Pierzine, Luciano Ramallo, Frank Ruiz et Dmitry Zinoviev. Beaucoup de cette liste sont également des développeurs de noyaux pytest et / ou prennent en charge d'incroyables plugins pytest.
Un merci spécial à Luciano. Après avoir écrit ce livre, j'ai envoyé les quatre premiers chapitres à plusieurs critiques. Luciano était l'un d'entre eux, et sa critique était la plus difficile à lire. Je ne pense pas avoir suivi tous ses conseils, mais à cause de ses remarques, j'ai révisé et réécrit la plupart des trois premiers chapitres et changé quelque chose dans le reste du livre.
Merci à toute l'équipe de pytest-dev d'avoir créé un outil de test aussi cool. Merci à Oliver Bestwalter, Florian Bruhin, Floris Bruinoohe, Dave Hunt, Holger Kreckel, Bruno Oliveira, Ronnie Pfannschmidt, Rafael Pierzine et bien d'autres pour avoir répondu à mes questions sur la vie au fil des ans.
Et enfin et surtout, je dois remercier les personnes qui m'ont remerciée. Ils en ont profité pour m'informer par mail que mon travail leur a fait gagner du temps et a facilité le travail. C'est cool et ça me fait plaisir! Je vous remercie!
Brian okken
septembre 2017
Préface
L'utilisation de Python augmente non seulement dans le développement de logiciels, mais aussi dans des domaines tels que l'analyse de données, la recherche, les tests et les mesures, ainsi que dans d'autres secteurs. Le développement de Python dans de nombreux domaines critiques s'accompagne également de la volonté d'effectuer des tests logiciels correctement, efficacement et efficacement pour s'assurer que les programmes fonctionnent correctement et donnent les bons résultats. De plus, de plus en plus de projets logiciels s'étendent sur l'intégration continue et incluent une phase de test automatisée car les cycles de publication sont raccourcis et un test manuel minutieux de projets de plus en plus complexes n'est tout simplement pas faisable. Les équipes doivent pouvoir faire confiance aux tests effectués par les serveurs d'intégration continue qui leur indiquent s'ils peuvent faire suffisamment confiance à leur logiciel pour le publier.
Entrez pytest.
Qu'est-ce que pytest?
Outil de test Python fiable, pytest peut être utilisé pour tous les types et niveaux de tests logiciels. pytest peut être utilisé par les équipes de développement, les équipes d'assurance qualité, les groupes de test indépendants, les personnes pratiquant le TDD et les projets open source. En fait, les projets sur Internet sont passés de l' unittest ou nose à pytest , y compris Mozilla et Dropbox. Pourquoi? Parce que pytest offre des fonctionnalités puissantes comme la réécriture "assert", des modèles de plug-ins tiers et un modèle de montage puissant mais simple qui est inégalé dans tout autre cadre de test.
pytest est une plate-forme de test de logiciels, ce qui signifie que pytest est un programme en ligne de commande. Un outil qui trouve automatiquement des tests écrits, exécute des tests et écrit des rapports avec le résultat. Il possède une bibliothèque de lotions que vous pouvez utiliser dans les tests pour vous aider à tester plus efficacement. Il peut être étendu en écrivant vos propres plugins ou en installant des tiers. Il peut être utilisé pour tester les distributions Python. Et il s'intègre parfaitement avec d'autres outils tels que l'intégration continue et l'automatisation Web.
Voici quelques raisons pour lesquelles pytest se distingue parmi de nombreux autres tests de systèmes intégrés:
- Les tests simples sont faciles à écrire dans pytest.
- Les tests complexes sont encore plus faciles à écrire.
- Les tests sont faciles à lire.
- Les tests sont faciles à lire. (Il est si important que cela soit indiqué deux fois.)
- Vous pouvez commencer en quelques secondes.
assert
utilisé pour échouer au test, pas self.assertEqual()
ou self.assertLessThan()
. Affirmez !- Vous pouvez utiliser pytest pour exécuter des tests écrits pour unittest ou nez.
pytest est activement développé et soutenu par une communauté passionnée et croissante. Il est tellement extensible et flexible qu'il s'intègre facilement dans votre flux de travail. Et comme il est installé séparément de votre version de Python, vous pouvez utiliser la même dernière version de pytest sur l'héritage Python 2 (2.6 et supérieur) et Python 3 (3.3 et supérieur).
Apprentissage de pytest lors du test d'un exemple d'application
Aimeriez-vous apprendre pytest en testant des exemples stupides que vous ne verrez jamais dans la vraie vie? Moi aussi. Nous n'allons pas le faire dans ce livre. Au lieu de cela, nous allons écrire des tests pour un projet qui, j'espère, a beaucoup en commun avec les applications que vous testerez après avoir lu ce livre.
Projet de tâches
L'application que nous examinerons s'appelle Tâches. Tâches est une application de suivi des tâches minimale avec une interface de ligne de commande. Il a suffisamment de points communs avec de nombreux autres types d'applications, ce qui, j'espère, vous permet de voir facilement comment les concepts de test que vous apprenez lors du développement de tests contre des problèmes sont applicables à vos projets, maintenant et à l'avenir.
Bien que Tâches possède une interface de ligne de commande (CLI), la CLI interagit avec le reste du code via une interface de programmation d'application (API). Une API est l'interface vers laquelle nous dirigerons la plupart de nos tests. L'API interagit avec la couche de gestion de base de données, qui interagit avec la base de données de documents - MongoDB ou TinyDB . Le type de base de données est configuré lors de l'initialisation de la base de données. Avant de nous concentrer sur l'API, examinons les tâches elles-mêmes, un outil en ligne de commande qui fournit une interface utilisateur pour les tâches.
Voici un exemple de session:
$ tasks add 'do something' --owner Brian $ tasks add 'do something else' $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 False do something else $ tasks update 2 --owner Brian $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 Brian False do something else $ tasks update 1 --done True $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian True do something 2 Brian False do something else $ tasks delete 1 $ tasks list ID owner done summary -- ----- ---- ------- 2 Brian False do something else $
Remarque du traducteur: dans le cas de l'utilisation de la plate-forme Windows, j'ai rencontré plusieurs problèmes lors du test de cette session.
- Un dossier doit être créé pour la base de données
tasks_db
nommé tasks_db
dans le dossier de votre utilisateur. Par exemple, c:\Users\User_1\tasks_db\
- Utilisez des guillemets au lieu des apostrophes. Sinon, nous obtenons une telle erreur.
$ tâches ajouter «faire autre chose»
Utilisation: les tâches ajoutent [OPTIONS] RÉSUMÉ
Erreur: vous avez obtenu des arguments supplémentaires inattendus (autre chose ')
Ce n'est pas l'application de gestion des tâches la plus difficile, mais assez complexe à utiliser pour étudier les tests.
Stratégie de test
Bien que pytest soit adapté aux tests unitaires, aux tests d'intégration, aux tests système ou aux tests de bout en bout et aux tests fonctionnels, la stratégie de test du projet Tâches se concentre principalement sur les tests fonctionnels sous-cutanés. Voici quelques définitions utiles:
- Test unitaire : test qui teste un petit morceau de code, tel qu'une fonction ou une classe, indépendamment du reste du système. Je passe en revue les tests du chapitre 1, Prise en main de pytest, à la page 1, pour effectuer des tests unitaires. La structure des données des tâches.
- Test d'intégration : un test qui teste un morceau de code plus volumineux peut inclure plusieurs classes ou sous-systèmes. La plupart du temps, l'étiquette utilisée pour certains tests est plus grande qu'un test unitaire, mais plus petite qu'un test système.
- Test système (de bout en bout) : test qui teste l'ensemble du système testé dans un environnement aussi proche que possible de l'environnement de l'utilisateur final.
- Test fonctionnel : test qui teste une fonctionnalité du système. Un test qui teste la façon dont nous ajoutons, supprimons ou mettons à jour un élément de tâche dans Tâches est un test fonctionnel.
- Test sous-cutané : test exécuté non pas pour l'interface utilisateur final, mais pour une interface située juste en dessous de la surface. Étant donné que la plupart des tests de ce livre sont testés au niveau de l'API, et non au niveau de la CLI, ils sont qualifiés de tests sous-cutanés.
Comment ce livre est-il organisé?
Au chapitre 1, «Prise en main de pytest» à la page 1, vous installez pytest et vous vous préparez à l'utiliser. Ensuite, vous prenez une partie du projet Tâches - une structure de données représentant une seule tâche (nommée tuple appelée Tâche) et l'utilisez pour tester des exemples. Vous apprendrez à exécuter pytest avec plusieurs fichiers de test. Vous verrez de nombreuses options de ligne de commande populaires et extrêmement utiles pour pytest, telles que la possibilité de redémarrer les échecs de test, d'arrêter l'exécution après le premier échec, de contrôler la trace de la pile et la version multi-pages du test, et bien plus encore.
Dans le chapitre 2, «Création de fonctions de test», page 23, vous installez les tâches localement avec pip et voyez comment structurer les tests dans un projet Python. Vous devez le faire pour commencer à écrire des tests pour une application réelle. Tous les exemples de ce chapitre exécutent des tests pour l'application installée, y compris l'écriture dans la base de données. Les fonctions de test réelles sont au centre de ce chapitre et vous apprendrez à utiliser assert
efficacement dans les tests. Vous en apprendrez également sur les marqueurs. Une fonction qui vous permet de marquer de nombreux tests qui s'exécuteront simultanément, de marquer des tests qui seront ignorés, ou de dire à pytest que nous savons déjà que certains tests échoueront. Je vais vous expliquer comment exécuter uniquement certains tests, non seulement avec des marqueurs, mais aussi en structurant notre code de test en répertoires, modules et classes, et comment exécuter ces sous-ensembles de tests.
Tous les codes de test ne sont pas inclus dans les fonctions de test. Dans le chapitre 3, «Appareils pytest», à la page 49, vous apprendrez comment mettre des données de test dans des appareils de test, ainsi que configurer et casser le code. La définition de l'état d'un système (ou d'un sous-système ou d'une unité individuelle) est une partie importante des tests logiciels. Vous apprendrez cet aspect des montages pytest pour aider à initialiser la base de données du projet Tâches et préremplir les données de test pour certains tests. Les appareils sont une partie incroyablement puissante de pytest, et vous apprendrez à les utiliser efficacement pour réduire davantage la duplication du code de test et aider à rendre votre code de test incroyablement lisible et maintenable. Les appareils Pytest sont également paramétrables, similaires aux fonctions de test, et vous utiliserez cette fonction pour pouvoir exécuter tous vos tests avec TinyDB et MongoDB, les parties du serveur de base de données prises en charge par les tâches.
Au chapitre 4, «Luminaires intégrés», à la page 71, vous verrez certains des luminaires intégrés fournis par pytest. Vous apprendrez comment les appareils intégrés pytest peuvent suivre les répertoires et fichiers temporaires pour vous, vous aider à vérifier la sortie du code de test, utiliser des correctifs de singe, rechercher des avertissements et bien plus encore.
Dans le chapitre 5, «Plugins», page 95, vous apprendrez à ajouter des options de ligne de commande à pytest, à modifier la sortie de pytest et à partager les paramètres de pytest, y compris les fixtures, avec d'autres utilisateurs via l'écriture, l'empaquetage et la distribution ( distribution) propres plugins. Le plugin que nous développons dans ce chapitre est utilisé pour créer un peu plus les erreurs de test que nous voyons lors des tests de tâches. Vous apprendrez également comment tester correctement les plugins. Quel genre de méta? Et juste au cas où, si vous n'êtes pas assez inspiré par ce chapitre pour écrire vos propres plugins, j'ai ramassé un tas d'excellents plugins pour montrer ce qui est possible dans l'annexe 3, «Plugin Sampler Pack», page 163.
En parlant de personnalisation, au chapitre 6, «Configuration», page 113, vous apprendrez comment configurer le lancement de pytest par défaut pour votre projet à l'aide des fichiers de configuration. Avec le fichier pytest.ini , vous pouvez faire des choses telles que le stockage des paramètres de ligne de commande afin que vous n'ayez pas à les saisir tout le temps, dire à pytest de ne pas chercher dans les répertoires spécifiques des fichiers de test, spécifier la version minimale de pytest que votre tests, et plus encore. Ces éléments de configuration peuvent être placés dans tox.ini ou setup.cfg .
Dans le dernier chapitre, Chapitre 7, Utilisation de pytest avec d'autres outils, à la page 125, vous verrez comment vous pouvez prendre le pytest déjà puissant et surcharger vos tests avec des outils supplémentaires. Vous exécuterez le projet Tâches sur plusieurs versions de Python avec tox. Vous testerez les tâches CLI sans exécuter le reste du système avec une simulation. Vous utiliserez coverage.py pour vérifier si le code source du projet de tâche est en cours de test. Vous utiliserez Jenkins pour exécuter des suites de tests et afficher les résultats au fil du temps. Et enfin, vous verrez comment pytest peut être utilisé pour exécuter des tests plus intacts, ainsi que pour échanger des appareils de style pytest avec des tests basés sur unittest.
Ce que vous devez savoir
Python
Vous n'avez pas besoin d'être un gourou de Python. Les exemples ne font rien de surnaturel ou de bizarre.
pip
Vous devez utiliser pip pour installer les plugins pytest et pytest lui-même. Si vous souhaitez mettre à niveau pip, voir Annexe 2, pip, à la page 159.
Ligne de commande
J'ai écrit ce livre et capturé des exemples de sortie en utilisant bash sur un ordinateur portable Mac. Cependant, les seules commandes que j'utilise dans bash sont cd pour aller dans un répertoire spécifique et bien sûr pytest. Étant donné que cd existe dans Windows cmd.exe et dans tous les shells Unix que je connais, tous les exemples doivent être disponibles pour s'exécuter dans n'importe quelle application de terminal que vous décidez d'utiliser.
C’est tout. Vous n'avez pas besoin d'être un expert en programmation pour commencer à écrire des tests automatisés avec pytest.
Exemples de code et ressources Internet
Les exemples de ce livre sont écrits en utilisant Python 3.6 et pytest 3.2. pytest 3.2 prend en charge Python 2.6, 2.7 et Python 3.3+.
Le code source du projet Tâches, ainsi que pour tous les tests présentés dans ce livre, est disponible sur le lien sur la page Web du livre à pragprog.com . Vous n'avez pas besoin de télécharger le code source pour comprendre le code de test; le code de test est présenté sous une forme pratique dans les exemples. Mais afin de suivre les tâches du projet ou d'adapter des exemples de test pour tester votre propre projet (vos mains ne sont pas liées!), Vous devez vous rendre sur la page Web du livre pour télécharger le travail. Là, sur la page Web du livre, il y a un lien vers le message d' errata et le forum de discussion .
Je programme depuis plus de vingt-cinq ans, et rien ne m'a incité à écrire autant de code de test que pytest. J'espère que vous apprendrez beaucoup de ce livre et j'espère qu'à la fin vous aimerez le code de test comme moi.
Plus loin 