unittest for command line arguments

时间:2018-03-21 22:26:07

标签: python unit-testing optionparser

如何针对错误的命令行参数对我的脚本进行单元测试?

例如,

  

my_script.py -t

由于-t标志不存在,

应该给出错误,如下面的代码所示:

parser = OptionParser()

parser.add_option("-d",
              action="callback",
              callback=get_bios_difference,
              help="Check difference between two files"
              )

(options, args) = parser.parse_args()

if len(sys.argv) == 1:  # if only 1 argument, it's the script name
   parser.print_help()
   exit()

2 个答案:

答案 0 :(得分:0)

首先,你需要一个单位测试:

def parse_options(args=None):
    # Duplicating the default behavior of OptionParser.parse_args
    if args is None:
        args = sys.argv[1:]

    parser = OptionParser()

    parser.add_option("-d",
                  action="callback",
                  callback=get_bios_difference,
                  help="Check difference between two files"
                  )

    (options, args) = parser.parse_args(args)

    if not args:
       parser.print_help()
       exit()

请注意,我们明确地将args传递给parse_args,而不是假设要解析sys.argv

在制作中,您可以拨打parse_options(),它会像以前一样工作。对于测试,您可以调用parse_options([])parse_options(["-t"])或您要测试的其他任何参数组合。

所有这一切,您应该在新代码中使用argparse而不是optparse(已被弃用多年)。

答案 1 :(得分:0)

OptionParser

  

自版本2.7以来不推荐使用:不推荐使用optparse模块,不会进一步开发;开发将继续使用argparse模块。

您的问题与unittest无关? assert不需要nargs=2--d定义的2个项目。

argparse会检查你的args数量,这里是parameter.py

import argparse
from pprint import pprint

def get_parser():
    parser = argparse.ArgumentParser(description='example of argparse')

    parser.add_argument('--d', type=str, nargs=2, help='2 files')
    return parser

if __name__ == '__main__':
    parser = get_parser()
    args = parser.parse_args(sys.argv[1:])
    pprint(args)

使用2个文件运行:

parameter.py --d a b
Namespace(d=['a', 'b'])

使用1参数

运行时
parameter.py --d a
parameter.py: error: argument --d: expected 2 argument(s)