Setting command line arguments for main function tests

后端 未结 3 1738
我在风中等你
我在风中等你 2021-01-12 04:51

I have a main() function in python that gets command line arguments. Is there a way for me to write pytest tests for this function and define the arguments in the code?

相关标签:
3条回答
  • 2021-01-12 05:18

    The best solution I found so far is this

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

    and for flags:

    sys.argv.append("-f")
    sys.argv.append("v")
    
    0 讨论(0)
  • 2021-01-12 05:25

    To add to the previous answers, instead of modifying sys.argv It is safer to use a context manager which can cover up and protect the underlying object. An example would be

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

    This works only with python3. For python2 the Mock library does the trick.

    I found this solution on a different stackoverflow post here.

    0 讨论(0)
  • 2021-01-12 05:28

    parse_args takes a argv parameter. The docs uses this repeatedly in it's examples

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

    where the string list replicates sys.argv[1:] that it would get from the commandline. If the argument is None (or omitted) the parser uses sys.argv[1:].

    So if

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

    You could test with

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

    The unittesting file for argparse.py uses both this approach, and your's of modifying sys.argv directly.

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

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

    0 讨论(0)
提交回复
热议问题