python,unittest:有没有办法将命令行选项传递给应用程序

jd.*_*jd. 45 python unit-testing

我有一个模块导入unittest并有一些TestCases.我想接受一些命令行选项(例如下面,数据文件的名称),但是当我尝试传递选项时,我收到消息"选项-i not recognized".是否可以让unittest +为应用程序提供选项(注意:我使用optparse来处理选项)?谢谢.

$ python test_app_data.py -i data_1.txt

option -i not recognized
Run Code Online (Sandbox Code Playgroud)

=====================

后续行动:这是建议解决方案的实施:

import cfg_master  #has the optparse option-handling code

...

if __name__ == '__main__':    
    #add you app's options here...
    options_tpl = ('-i', '--in_dir', '-o', '--out_dir')
    del_lst = []
    for i,option in enumerate(sys.argv):
        if option in options_tpl:
            del_lst.append(i)
            del_lst.append(i+1)

    del_lst.reverse()
    for i in del_lst:
        del sys.argv[i]

    unittest.main()
Run Code Online (Sandbox Code Playgroud)

tgh*_*ghw 58

基于Alex的答案,实际上很容易使用argparse:

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--input', default='My Input')
    parser.add_argument('filename', default='some_file.txt')
    parser.add_argument('unittest_args', nargs='*')

    args = parser.parse_args()
    # TODO: Go do something with args.input and args.filename

    # Now set the sys.argv to the unittest_args (leaving sys.argv[0] alone)
    sys.argv[1:] = args.unittest_args
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

我没有测试你可以传递给unittest的所有标志,看看它们是否有效,但是传入测试名称确实有效,例如:

python test.py --input=foo data.txt MyTest
Run Code Online (Sandbox Code Playgroud)

foo和运行MyTest data.txt.

  • 太好了!更好的是,`unittest.main()`接受一个argv参数,所以你不必乱用全局的sys.argv,例如:`unit_argv = [sys.argv [0]] + args.unittest_args; unittest.main(argv的= unit_argv)` (7认同)
  • 您可以使用`.parse_known_args()`而不需要使用`nargs ='*''选项; 请参阅[Python:运行unittest.TestCase而不调用unittest.main()?](http://stackoverflow.com/a/17259773)获取我的版本. (6认同)

Ale*_*lli 32

在你的if __name__ == '__main__':部分,这你不向我们展示了,你需要optparsedel sys.argv[1:]传递控制之前unittest的代码,从而使后者的代码不会试图解释你的命令行选项再次,当你已经处理得.(拥有自己的一些选项并且将一些选项传递给它有点困难unittest,尽管如果你确实有这样复杂的需求可以做到这一点).

  • @Matt,将`sys.argv`设置为你想要`unittest.main`解析的那些args - 不多也不少. (3认同)