如何使用argparse删除CLI参数,以便unittest接受arg lis

2024-04-29 11:05:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把我自己的参数传递到为unittest设置的文件中。所以从命令行这样调用它应该可以:

python杂项/测试.py--c级基思·伊尼一些测试。测试一你知道吗

目前我遇到了两个问题。你知道吗

1)Arg parse不允许未知参数

用法:测试.py[-h][--c确认] 测试.py:错误:无法识别的参数:一些测试。测试一你知道吗

2)单元测试不允许未知参数。所以--c文件名不被unittest接受并返回:

AttributeError:“module”对象没有属性“keith”

因此,我们的想法是在调用unittestrunner之前收集并删除我的参数。你知道吗

import unittest
import argparse

myArgs = None

def getArgs( allArgs ):
    parser = argparse.ArgumentParser( )
    parser.add_argument('--c', dest='conFile', type=str, default=None, help='Config file')
    args = parser.parse_args()

    if ( args.conFile == None ):
        parser.print_help()

    return args


class SomeTests(unittest.TestCase):
    def test_one(self):
        theTest( 'keith' )

    def test_two(self):
        otherTest( 'keith' )

if __name__ == '__main__':
    myArgs = getArgs( sys.argv )
    print 'Config File: ' + myArgs.conFile
    unittest.main( argv=sys.argv, testRunner = unittest.TextTestRunner(verbosity=2))

有趣的是,我刚刚发现parse_known_args(),所以我将parse行更改为:

args = parser.parse_known_args(['--c']). 

我想这会解决我的问题,并给我一些通过unittest。不幸的是我得到:

Test.py: error: argument --c: expected one argument. 

这不管用吗?你知道吗


Tags: pyimportnoneparser参数parsedefargparse
1条回答
网友
1楼 · 发布于 2024-04-29 11:05:30

好吧,我费了点劲,但还是弄明白了。这是完全可能的。argparse的文档不正确。函数parse \u known \u args()不应包含已知参数的列表。另外,argparse删除arg[0],这对于返回arg[0]非常重要,以便其他命令可以看到有效的参数列表。我认为这是个错误。我已经包含了最后的示例代码。一旦你把它保存到一个文件中,你就可以像下面的例子那样调用它,它就可以工作了。你知道吗

python Misc/Test.py                     # Requires config file
python Misc/Test.py  c keith.ini       # Runs all tests
python Misc/Test.py  c keith.ini SomeTests          # Runs Class
python Misc/Test.py  c keith.ini SomeTests.test_one # Runs test

import unittest
import argparse

myArgs = None

def getArgs( allArgs ):
    parser = argparse.ArgumentParser( )
    parser.add_argument(' c', dest='conFile', type=str, default=None, help='Configuration file. (Required)')
    args, addArgs = parser.parse_known_args( )

    if ( args.conFile == None ):
        parser.print_help()
        sys.exit(2)

    # argparse strips argv[0] so prepend it
    return args, [ sys.argv[0]] + addArgs

def verify( expected, actual ):
    assert expected == actual, 'Test Failed: '

# Reusable Test
def theTest( exp ):
    print 'myargs: ' + str( myArgs )
    verify( exp, 'keith' )

def otherTest( exp ):
    theTest( exp )

class SomeTests(unittest.TestCase):
    def test_one(self):
        theTest( 'keith' )

    def test_two(self):
        otherTest( 'keith2' )

if __name__ == '__main__':
    myArgs, addArgs = getArgs( sys.argv )
    unittest.main( argv=addArgs, testRunner = unittest.TextTestRunner(verbosity=2))

嗯,好好享受

相关问题 更多 >