![](/img/trans.png)
[英]how to test python file with pytest having if __name__ == '__main__': with arguments
[英]Test if __name__ == "__main__": with click and pytest
我在test.py
有以下代碼:
import click
@click.command()
@click.option('--text', default='hello world', help='Text to display.')
def say(text):
print(text)
if __name__ == "__main__":
say()
如果我在命令行中調用它,它會起作用:
python test.py --text=hi!
>>hi!
如果我想測試我的代碼,我會使用:
from click.testing import CliRunner
runner = CliRunner()
result = runner.invoke(test.say, ['--text=blablabla'])
assert result.output == 'blablabla
這也有效。
但是,如果我通過coverage.py 運行我的測試,我會看到if __name__ == "__main__":
下的代碼沒有經過測試。 有沒有辦法實現這一目標?
也許您沒有意識到__name__ == "__main__"
下面的代碼從未被您的測試代碼調用
result = runner.invoke(test.say, ['--text=blablabla'])
即使您像這樣修改“test.py”,您的測試也不會抱怨。
if __name__ == "__main__":
raise RuntimeError("Something is wrong")
say()
原因是如果導入了模塊文件“test.py”, __name__ == "__main__"
將是假的。 所以if
子句中的任何代碼都將被忽略。
要獲得 100% 的覆蓋率,請直接運行命令
$ coverage run test.py --text=blablabla
blablabla
$ coverage report
Name Stmts Miss Cover
-----------------------------
test.py 6 0 100%
這就是標准庫模塊runpy
的用途。 請參閱: https : //docs.python.org/3/library/runpy.html#runpy.run_module
__name__ != "__main__"
如果你從不同的模塊調用它。
應該做的是:
import click
@click.command()
@click.option('--text', default='hello world', help='Text to display.')
def say(text):
print(text)
say()
如果您不想這樣做,請參閱其他 SO 答案。: https : //stackoverflow.com/a/5850364/10813463
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.