繁体   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