![](/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.