python - 如何使用 argparse 删除 CLI 参数,以便 unittest 接受 arg list
问题描述
我想将自己的参数传递到为 unittest 设置的文件中。所以像这样从命令行调用它应该可以工作:
python Test.py --c keith.ini SomeTests.test_one
目前我遇到了两个问题。
1) Arg 解析不允许未知参数
用法:Test.py [-h] [--c CONFILE] Test.py:错误:无法识别的参数:SomeTests.test_one
2)单元测试不允许未知参数。所以 --c fileName 不被 unittest 接受并返回:
AttributeError:“模块”对象没有属性“基思”
所以想法是在调用 unittest runner 之前收集我的参数并删除它们。
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() 所以我将解析行更改为:
args = parser.parse_known_args(['--c']).
我认为这会解决我的问题并给我一些东西来传递给单元测试。不幸的是我得到:
Test.py: error: argument --c: expected one argument.
这不应该工作吗?
解决方案
OK 费了一番功夫,但还是想通了。这是完全可能的。argparse 的文档不正确。函数 parse_known_args() 不应包含已知参数的列表。argparse 还删除了 arg[0],这对于返回很重要,因此其他命令可以看到有效的参数列表。我认为此删除是一个错误。我已经包含了最后的示例代码。
import unittest
import argparse
import sys
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))
一旦你把它保存到一个文件中,你就可以像下面的例子那样调用它,它就可以工作了。
python Test.py # Requires config file
python Test.py --c keith.ini # Runs all tests
python Test.py --c keith.ini SomeTests # Runs Class
python Test.py --c keith.ini SomeTests.test_one # Runs test
HTH,享受
推荐阅读
- python - pd.Series.argsort() 和 nan-values
- java - Spring Boot + Angular JS JBoss 部署
- java - 从 6.7.7 升级后,Sonarqube 7.9.1 拒绝启动
- javascript - DOMSubtreeModified jQuery 的替代方案
- python-3.x - 如何获取类下 td 标签的值?
- c# - 方法参数参考与值的线程安全
- sql - 如何从选择的最后结果中进行选择
- powerbi - 从 Microsoft Power BI 中表的每一行中减去度量值
- kubernetes - 如何处理 ConfigMaps 中的秘密?
- android - 在本机反应中使用html元素格式化字符串