pytest différé plugin assert / multiple failure, itération 1

By | mai 14, 2019

trouver un expert Python

Dans Delayed assert / plusieurs échecs par test, j’ai présenté une première tentative d’écriture d’une fonction ‘expect ()’ qui permettra
une fonction de test pour collecter plusieurs échecs et ne pas arrêter l'exécution jusqu'à la fin du test.

Il n’ya pas de gros problème avec cette méthode.
Je n’aime pas avoir à appeler «assert_expectations ()» dans le test.
Ce serait cool d'insérer cette partie dans un plugin.

Donc, même si ce n’est pas le code le plus joli, voici une première tentative pour en faire un plugin.

Code de test qui utilise expect ()

L’objectif principal de cette première itération est de supprimer l’appel ‘assert_expectations ()’ des tests.
J'aimerais que mes tests s'appellent simplement "expect ()", comme ceci:

test_delayed_assert.py

Le plugin conftest.py local pour une assertion différée

Les appels "expect ()" vont générer une liste d’échecs.
Nous devons saisir cette liste et faire échouer le test.

Tout d’abord, il semble utile de s’assurer que la liste «_failed_expectations» est vide au début du test. J’ai donc ajouté un appel à l’effacer dans «pytest_runtest_setup ()».

Ensuite, dans "pytest_report_teststatus ()", je recherche les échecs et remplis les mots "report.outcome" et "report.longrepr".

conftest.py

Modifications apportées à delay_assert.py

Le code dans «conftest.py» appelle de nouvelles fonctions dans «delay_assert.py».
Voici les modifications apportées à ‘delay_assert.py 'pour que cela fonctionne.

delay_assert.py

En le voyant en action

Juste pour vous montrer que cela fonctionne réellement.

essai

Problèmes possibles et choses que je n'aime pas

Cela semble fonctionner, du moins dans ce cas de test simple.

Je ne suis pas ravi que la fonctionnalité soit partagée entre deux fichiers, «conftest.py» et «delay_assert.py». Je ne sais pas si c’est juste que je sois pointilleux.

Voici ma liste initiale de problèmes possibles.

  1. La liste '_failed_expectations' peut ne pas fonctionner correctement pour la parallélisation, par exemple avec xdist.
  2. La fonction expect () serait plus cool si elle effectuait certaines assertions comme voodoo que pytest utilise pour rendre le rapport très lisible. Ce n'est pas obligatoire, mais ce serait cool.
  3. Je ne suis pas sûr d’être ravi du nom «différé», puisque la fonction est «expect ()», et qu’il n’y a plus d’affirmation. Mais "expect ()" signifie quelque chose de différent pour certaines personnes, et il y a déjà une attente pytest dans le référentiel. Peut-être «multi-échec»? Nah. C'est nul.
  4. … Vraiment, il y avait plus de choses que je n’aimais pas à ce sujet. Je pense que la médecine froide et le porteur se mélangent et,… ils sont partis.

Je suis sûr que tout le monde qui lit ceci peut trouver des failles dans ma solution.
S'il vous plaît, faites-moi savoir.

Solutions alternatives

Quelques personnes ont indiqué qu’il serait préférable de se connecter à «pytest_runtest_makereport» plutôt qu’à «pytest_report_teststatus».
C’est peut-être tout à fait valable, mais je n’ai pas encore essayé d’y prendre part.

J’ai aussi pensé à faire de «expect» un vrai projecteur, ce qui permettrait certainement de tout mettre dans un fichier. Juste pas sûr si j'aime avoir les tests doivent déclarer un résultat attendu.
Cependant, cela pourrait ne pas être si mauvais.

Prochaines étapes

J'aimerais avoir des retours à ce sujet et des idées pour l’améliorer.

J'aimerais également continuer à montrer comment en faire un plug-in et un package pytest installables, etc.

Ensuite, peut-être le pousser vers github ou bitbucket, pour permettre les contributions des autres.

Quoi qu’il en soit, c’est amusant de mettre ça en public. Les verrues et tous.