【问题标题】:Setting command line arguments for main function tests为主函数测试设置命令行参数
【发布时间】:2017-09-09 10:41:18
【问题描述】:

我在 python 中有一个 main() 函数,它获取命令行参数。 有没有办法让我为这个函数编写 pytest 测试并在代码中定义参数?

例如

def main():
    # argparse code
    args, other = arg_parser.parse_known_args()
    return args.first_arg


def test_main():
    res = main() # call with first_arg = "abc"
    assert(res == "abc")

【问题讨论】:

    标签: python pytest argparse


    【解决方案1】:

    补充前面的答案,而不是修改sys.argv,使用可以覆盖和保护底层对象的上下文管理器更安全。一个例子是

    with unittest.mock.patch('sys.argv', ['program_name', '--option1', 'inputFile']):
        main()
    

    这仅适用于 python3。对于 python2,Mock 库可以解决问题。

    我在另一个 stackoverflow 帖子 here 上找到了这个解决方案。

    【讨论】:

    • 上下文管理器是一个很好的补充。您确实需要在列表中添加一个额外的第一个字符串,因为 sys.argv 中的第一个字符串会被 argparse 忽略。所以像['junk', '--option1', 'inputFile'].
    【解决方案2】:

    parse_args 采用argv 参数。文档在其示例中反复使用它

    parser = argparse.ArgumentParser()
    parser.add_argument('--foo', action='store_true')
    parser.add_argument('bar')
    parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])
    

    字符串列表复制从命令行获取的sys.argv[1:]。如果参数是None(或省略),则解析器使用sys.argv[1:]

    如果

    def main(argv=None):
        # argparse code
        args, other = arg_parser.parse_known_args(argv)
        return args.first_arg
    

    你可以测试

    main(['foo', '-f','v'])
    

    argparse.pyunittesting 文件既使用了这种方法,也使用了您直接修改sys.argv 的方法。

    https://docs.python.org/3/library/argparse.html#beyond-sys-argv

    https://docs.python.org/3/library/argparse.html#partial-parsing

    【讨论】:

    • 您的解决方案如何与 pytest 测试配合使用?
    【解决方案3】:

    目前我发现的最佳解决方案是这个

    def test_main():
        sys.argv = ["some_name", "abc"]
        res = main()
    

    对于标志:

    sys.argv.append("-f")
    sys.argv.append("v")
    

    【讨论】:

      猜你喜欢
      • 2020-08-04
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多