![](/img/trans.png)
[英]Test if __name__ == "__main__": with click and pytest
[英]how to test python file with pytest having if __name__ == '__main__': with arguments
我想使用包含if __name__ == '__main__':
它还解析了 arguments。 代码是这样的:
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Execute job.')
parser.add_argument('--env', required=True, choices=['qa', 'staging', 'prod'])
args = parser.parse_args()
# some logic
这里的限制是我不能添加一个main()
方法并将逻辑包装在if __name__ == '__main__':
里面并从那里运行它! 该代码是旧代码,无法更改!
我想用 pytest 对此进行测试,我想知道如何在我的测试中运行带有一些 arguments 的 python 文件?
命令行 arguments 与其他任何输入/输出机制一样。 关键是将它隔离在“边界层”中,并且让您的主程序不直接依赖它们。
在这种情况下,不要让您的程序直接访问sys.argv
(本质上是一个全局变量),而是让您的程序被包装在一个“入口点”function(例如“main”)中,它将 args 作为显式参数.
如果您没有将任何 arguments 传递给ArgumentParser.parse_args
,则默认为您访问sys.argv
。 相反,只需传递您的args
参数。
它可能看起来像:
def main(args):
# some logic
pass
if __name__ == '__main__':
main(sys.arv)
您的单元测试可以调用此入口点 function 并传入他们想要的任何参数:
def test_main_does_foo_when_bar():
result = main(["bar"])
assert "foo" == result
通常我制作一个main
的 function ,它总是采用 arguments 并在需要时使用命令行 arguments 调用它。
def main(args):
# parser : argparse.ArgumentParser
args = parser.parse_args(args)
pass
if __name__ == '__main__':
main(sys.argv[1:])
从命令行运行时,它将使用命令行 arguments 调用。 可以随时直接调用main
调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.