【发布时间】:2019-09-26 19:12:25
【问题描述】:
我想将我自己的参数传递到为 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: 'module' 对象没有属性 'keith'
所以想法是在调用 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.
这不应该工作吗?
【问题讨论】:
-
unittest 有自己的 sys.argv 解析器,可能是 argparse 解析器。我认为它在您的脚本之前运行。我没有办法做你想做的事。
-
好的,我想通了。 Python的官方文档不正确。它显示包括已知参数的列表,但它仅在您不包含 parse_known_args() 函数的参数列表时才有效。我将 parse 和 extraArgs 都打印出来,它们都返回正确的列表。所以我“应该”能在午餐后完成剩下的工作。
-
我的评论适用于您使用测试文件作为参数调用 unitest 的情况。您正在从脚本中调用 unitest,因此您拥有更多控制权。
-
@hpaulj OK 终于明白了。我继续并在下面提供了完整的答案。希望这会帮助下一个寻找这个的人。
标签: python python-2.7 argparse python-unittest