繁体   English   中英

如何使用 pytest 测试 python 文件 if __name__ == '__main__': with arguments

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM