簡體   English   中英

測試是否 __name__ == "__main__": with click 和 pytest

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM