Transcription de l'épisode 2: Pytest vs Unittest vs Nose

By | avril 11, 2019

Expert Python

Ceci est la transcription de Test and Code Podcast, épisode 2

Bonjour à tous. Je m'appelle Brian Okken. Bienvenue sur le podcast de test Python (maintenant appelé «Test & Code»).

Aujourd'hui, je veux parler du choix d'un framework de test. Quand je suis allé regarder les différents frameworks, j'ai remarqué que l'untestest et le doctest faisaient partie de la bibliothèque standard, mais que nez et pytest étaient également utilisés assez souvent, j'ai donc pensé que ces quatre étaient de bonnes choses à examiner. En réalité, ce que je cherchais n’était pas un cadre unittest, mais un cadre de test fonctionnel. Ils sont vraiment la même chose. Je ne savais pas s’il s’agissait d’une liste complète, j’ai donc posté un post sur mon site Web avec un sondage demandant à d’autres personnes si elles s’intéressaient à celles-ci et si rien d'autre. Et principalement ces quatre sont revenus en tant que choses que les gens voulaient entendre.

Alors, comment je choisis?

Je ne sais vraiment pas comment vous dire comment choisir vous-même, mais je peux vous expliquer la séquence que j’ai vécue. Un peu comme acheter une voiture, j'ai énuméré mes exigences et les ai ensuite testées. Alors, quelles sont mes exigences? La configuration et la suppression de l’essai sont des considérations importantes pour moi. Les montages à plusieurs niveaux sont donc importants. Ma philosophie en matière de développement logiciel signifie que j’écris des tests pour des fonctionnalités qui n’existent pas encore. Il est donc important de pouvoir marquer un test et s’attendre à ce qu’il échoue. Je pense qu’il est important de pouvoir continuer à utiliser une fonction de test après un échec, ce qui est très différent de la déclaration assert. Ensuite, il est facile d’écrire des tests, un code standard minimum, des rapports facilement analysables. Nous avons également, puisque je travaille avec des instruments de test et il y a des choses que je veux courir entre les tests pour chaque test, même si quelqu'un oublie de le mettre là-dedans – la mise en place des montages requis sera bonne. Je ne savais pas si c'était possible. Ok, alors ce sont mes exigences. Je ne vais pas – j'ai expérimenté avec doctest, c'était une expérience amusante, j'ai écrit mes découvertes sur le site Web, mais je ne vais pas en parler ici parce que c'est simplement douloureux, mon expérience est principalement pour moi , il m’a dit que c’était trop pénible d’être utilisé comme cadre de test fonctionnel. Si vous en utilisez beaucoup, ce n’est pas pour moi. Cependant, je vais discuter de la façon dont le unittest, le nez et le pytest se sont empilés avec les exigences dont j'avais besoin.

En ce qui concerne les appareils à multiniveaux, je veux dire qu'ils sont tous capables de le faire, qu'ils soient tout-en-un, que ce soit le nez ou le nez. Ils peuvent tous supporter des appareils à plusieurs niveaux. Je peux avoir une installation au niveau du module, suivie d'une installation au niveau de la classe, suivie d'un configuration de niveau fonctionnel et ils peuvent interagir ensemble. Lorsque l’installation prend beaucoup de temps, c’est une bonne chose à faire dans une configuration de module ou de classe et une configuration de niveau de méthode s'assure simplement que la configuration est toujours correcte. C’est ce pour quoi je l’utilise. Donc, ils le supportent tous, cependant, les appareils nommés pytest sont beaucoup plus puissants et vous emmènent beaucoup plus loin, les appareils peuvent utiliser des appareils, la gestion des pannes d’appareils est plus simple à mon goût que le nez et le moins solide, le modèle d’appareil aide vous pensez davantage aux besoins individuels en ressources qu'au lieu de se limiter aux points d’entrée de la configuration. Juste, je l'aime mieux. Ok, les appareils à plusieurs niveaux fonctionnent tous, mais j’aime mieux utiliser les appareils de Pytest.

À propos des échecs prévus et des sauts. En fait, c’est quelque chose qui manque de façon intéressante dans le nez, que je sache, je n’ai trouvé nulle part comment obtenir les échecs attendus qui fonctionnent correctement dans le nez. Unittest fait cela, le test unitaire et le test pytest prennent en charge le marquage d’un test comme s’il échoue et le sautent. Ce qui est intéressant, à mon avis, est unittest qui permet une fonction skipif. En fait, unittest et pytest le font. Vous pouvez donc dire, vous savez, si vous utilisez une certaine version du logiciel, ignorez ce test, ou vraiment, n'importe quoi. Cependant, pour le marquage de l’échec attendu, pytest le prend en charge, pytest vous permet de dire si, dans cette version, il va échouer, je le sais. unittest n’a pas d’échec attendu si déclaration, je ne sais pas pourquoi. Et aussi le compte-rendu des échecs attendus et des sauts, je ne sais pas, j'aime un peu à quel point pytest rapporte un peu mieux que peu.

Qu'en est-il de l'exigence de poursuivre une fonction après un échec? Cela fait sens pour de nombreux tests fonctionnels et beaucoup de tests en général. Disons que j’ai, je ne sais pas, j’ai une fonction ou un paramètre qui a des effets secondaires. Il a cinq effets secondaires. Je veux m'assurer que ces cinq effets secondaires surviennent. Je vais avoir cinq déclarations d’affirmation, ou attendre des déclarations, ou quelque chose du genre. Et je veux en fait connaître le résultat de chacun d’eux, même si l’un d’eux a échoué. Par défaut, tous ces cadres, unittest, nose et pytest, s’arrêteront à la première assertion. Ce n’est pas surprenant et l’affirmation est une exception. J'étais un peu désespéré pour ça, alors j'ai travaillé. Et je voulais que ma première tentative de travail soit agnostique pour les frameworks afin que cela fonctionne dans tous les frameworks. Je l'ai décrit dans l'article intitulé Delayed Assert. J'ai également intégré cette solution dans une solution un peu plus propre pour un plugin appelé pytest appelé pytest expect; ce n’est pas sur PyPi mais il est disponible sur mon site. Donc, j'ai ajouté cette exigence. J'ai fait un travail qui fonctionnerait dans tous ceux-là. Cela fonctionne plus propre dans le pytest. Je pense que je pourrais probablement aussi créer des plugins pour unittest et nose. Je ne l’ai pas encore fait.

Que diriez-vous de facile à écrire des tests? Après avoir appris à propos de chacun d’entre eux, je ne pensais pas qu’un d’entre eux soit difficile, unittestest, nez, pytest, ils sont tous assez faciles à écrire des tests. La réécriture d’affirmation pytest, dont je vais parler dans un épisode futur, mais la réécriture d’affirmation est plutôt cool, et elle facilite les choses, vous évitant ainsi de vous rappeler ou de chercher un tas d’assistant fantaisie d’affirmation fonctions que vous faites dans unittest et le nez. De plus, le modèle de montage pytest facilite l'écriture de tests. Il y a plus de fonctionnalités comme les fonctions de test paramétrées. Ouais, je pense que pytest est un peu plus amusant pour le rendre plus facile à écrire.

Que diriez-vous d'une plaque de chaudière minimale? J'ai mis cela dans mes exigences parce que j'avais lu dans des billets qui disaient qu'Unitest avait trop de passe-partout, mais ce n'est vraiment pas beaucoup, il faut importer Unittest dans votre fichier et tous vos tests doivent appartenir à une classe dérivée de TestCase unittest. Je ne pense pas que ce soit un gros problème, obliger les gens à écrire en classe quand ils ne veulent pas, même s’ils ne les utilisent pas vraiment comme objets, c’est un peu étrange.

Qu'en est-il des rapports? Je ne sais pas. C’est un peu subjectif. Ils signalent tous des échecs de test et même si, comme je l’ai dit, le nez ne traite pas aussi bien les échecs attendus, mais les deux rapports, le moins rigoureux et le plus réaliste, sont acceptables. J'aime mieux le rapport pytest.

Appareils requis. J'aimerais que la configuration et le démontage soient exécutés à chaque test. Pour ma raison, je travaille beaucoup avec des instruments de test. L'instrument lui-même a un journal d'erreurs, par exemple, à titre d'exemple. Et au début de l’exécution du test, il est bon d’effacer le journal des erreurs, puis, après chaque test, un test individuel vérifie le journal des erreurs, signale une erreur et fait échouer le projecteur s’il existe des erreurs dans le journal des erreurs. C’est assez pratique à mettre – si vous le faites dans tous les tests – il est pratique de le mettre dans les appareils. Vous pouvez le faire avec des appareils avec nez et unittest mais la fonctionnalité autouse des appareils plus pytest le rend trivial.

Pour moi, pytest était clairement gagnant compte tenu de mes exigences, mais vous savez, tout le monde aura des exigences différentes. Une chose à considérer est les extensions et les plugins. Il y a des extensions et des plugins pour tous ceux-ci, et vous pouvez avoir le sentiment que c'est nécessaire – je veux dire, si vous avez l'extension requise que vous ne pouvez pas basculer, alors que vous ne décidez pas vraiment quel framework, vous avez déjà pris votre décision. Et gardez à l’esprit cependant que ce n’est probablement pas si terrible de changer. Commencez à tester. Ecrivez vos tests. Il suffit de choisir un cadre et de commencer et si vous changez d’avis dans quelques mois, le changement ne sera probablement pas terrible. N'oubliez pas non plus que Pytest est vraiment efficace pour courir sans fatigue et avec le nez. Si vous changez de nez uni ou de nez en nez, ce ne sera pas trop douloureux. En outre, il est intéressant de noter que de nombreux projets migrent de plus en plus pervers. Je n'ai jamais entendu parler de personnes qui s'éloignaient de phytostest pour s'endormir ou se mettre le nez.

L'autre chose que je voulais aborder est la vitesse. J'ai entendu des gens dire qu'ils avaient remarqué que Pytest était un peu plus lent à démarrer que les autres. En fait, je ne l’ai pas remarqué. Mais pour moi, si c'est un peu plus lent, cela n'aura pas vraiment d'importance, parce que, bien, pour trois raisons: premièrement, ce n'est apparemment pas assez lent pour que je le remarque, et deuxièmement, le temps de développement est beaucoup plus précieux pour moi que le temps d'ordinateur. Donc, si je dois laisser l'ordinateur fonctionner une seconde de plus, mais que cela me épargne des heures de tests, je le ferai aussi et je laisserai l'ordinateur fonctionner un peu plus longtemps. La troisième raison est les tests que j’écris, le temps de communication et de transfert des données est beaucoup plus long, c’est beaucoup plus long que la fonctionnalité pytest réelle ne prendra de toute façon, donc pytest ne va pas être le goulot d’étranglement de ma des tests; Mais si la vitesse vous pose vraiment problème, vous pouvez les essayer, les comparer, faire des tests de temps et déterminer s’il s’agit d’un problème.

Donc, c’est vraiment tout ce que je conseille – ce n’est pas vraiment un conseil, c’est un peu la façon dont j’ai vécu, j’ai suivi ces décisions. Mais je veux souligner quelque chose; choisir un cadre peut sembler la chose la plus importante à comprendre, car vous ne pouvez pas y aller. J'y étais, vous ne pouvez pas aller de l'avant tant que vous n'en choisissez pas et cela semble être une grosse décision que vous ne pouvez pas changer plus tard. Mais vous pouvez le changer plus tard, et cela ne devrait pas prendre trop de temps, à mon avis. Il suffit de choisir quelque chose et d’aller de l’avant, et d’échanger si vous en avez besoin, mais ne laissez pas cette décision prendre trop de temps. Donc, je suppose que ce que je dis, c'est qu'il y a un travail bien plus important à faire pour vous. Vous devez décider de ce qu'il faut tester sur votre projet et de la façon de le tester. Ne vous attardez pas trop sur quel framework.

Donc, c'est tout pour l'instant, j'aimerais entendre votre avis sur ce que vous utilisez, sur la manière dont vous avez pris ces décisions vous-même et sur les problèmes que vous rencontrez avec l'un des cadres. . Sur Twitter je suis @brianokken et ce podcast est @testpodcast. Donc, merci, à la prochaine fois.