0
votes

Tester si __name__ == "__main__": avec click et pytest

J'ai le code suivant dans test.py :

from click.testing import CliRunner


runner = CliRunner()
result = runner.invoke(test.say, ['--text=blablabla'])

assert result.output == 'blablabla

Si j'appelle cela dans la ligne de commande, cela fonctionne:

python test.py --text=hi!
>>hi!

Si je veux tester mon code, j'utiliserais:

import click

@click.command()
@click.option('--text', default='hello world', help='Text to display.')
def say(text):

    print(text)


if __name__ == "__main__":

    say()

Cela fonctionne aussi.

Cependant, si je exécuter mon test via coverage.py, je vois que le code sous if __name__ == "__main__": n'est pas testé. Y a-t-il un moyen d'y parvenir?


3 commentaires

À quoi ça sert? Pourquoi voudriez-vous tester cette condition? Vous devriez vraiment vous demander ce que vous essayez d'atteindre en améliorant la couverture des tests.


@yoyoyonny, je suis d'accord avec vous, étant juste un peu anal avec une couverture de code de test à 100%. Et cette question a attiré ma curiosité.


Eh bien, le moyen le plus simple d'obtenir 100% est de supprimer le code if __name__ == "__main__"


3 Réponses :


-2
votes

__name__! = "__main__" si vous ' vous appelez ceci à partir d'un autre module.

Ce qui devrait fonctionner est:

import click

@click.command()
@click.option('--text', default='hello world', help='Text to display.')
def say(text):

    print(text)

say()

Voir cette autre réponse SO si vous ne le faites pas Je ne veux pas faire ça de cette façon https://stackoverflow.com/a/5850364/10813463


1 commentaires

Cela ne répond pas à la question, qui concerne "si j'exécute mon test via coverage.py, je vois que le code sous if __name__ ==" __main__ ": n'est pas testé. Y a-t-il un moyen d'y parvenir? ".



1
votes

Peut-être que vous ne vous êtes pas rendu compte que les codes ci-dessous __name__ == "__main__" n'ont jamais été appelés par votre code de test

$ coverage run test.py --text=blablabla
  blablabla
$ coverage report
  Name      Stmts   Miss  Cover                                                                                                             
  -----------------------------                                                                                                             
  test.py       6      0   100%  

Même si vous modifiez le " test.py "comme ceci, votre test ne se plaindra pas.

if __name__ == "__main__":
    raise RuntimeError("Something is wrong")
    say()

La raison en est que __name__ ==" __main__ " sera faux si le le fichier de module "test.py" est importé. Ainsi, tous les codes à l'intérieur de la clause if seront ignorés.

Pour obtenir une couverture à 100%, exécutez la commande directement

result = runner.invoke(test.say, ['--text=blablabla'])

p >


0 commentaires

1
votes

C'est à cela que sert le module de bibliothèque standard runpy . Voir: https://docs.python.org/3/library/ runpy.html # runpy.run_module


0 commentaires