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 Réponses :
__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
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? ".
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 >
C'est à cela que sert le module de bibliothèque standard runpy
. Voir: https://docs.python.org/3/library/ runpy.html # runpy.run_module
À 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__"