在单元测试中解析命令行参数 python
Parse commandline args in unittest python
我正在使用 unittest 模块在 python 中创建一个测试用例。
我确实创建了一个我想从用户那里得到的解析参数列表。
但是当我在执行 python 脚本时使用该参数时,它会给出错误:“选项 -i 无法识别
用法:testing.py [选项] [测试] [...]"
代码片段:
class Testclass(unittest.TestCase):
@classmethod
def setUpClass(cls):
print "Hello Class"
def test_addnum(self):
print "Execute the test case"
#parser = parse_args(['-i'])
print 'simple_value =', args.inputfile
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
ns, args = parser.parse_known_args(namespace=unittest)
#args = parser.parse_args()
return ns, sys.argv[:1] + args
if __name__ == '__main__':
unittest.main()
使用 -i somefile.txt
执行上述脚本时出现的错误是:
option -i not recognized
Usage: testing.py [options] [test] [...]
Options:
-h, --help Show this message
-v, --verbose Verbose output
-q, --quiet Minimal output
-f, --failfast Stop on first failure
-c, --catch Catch control-C and display results
-b, --buffer Buffer stdout and stderr during test runs
Examples:
testing.py - run default set of tests
testing.py MyTestSuite - run suite 'MyTestSuite'
testing.py MyTestCase.testSomething - run MyTestCase.testSomething
testing.py MyTestCase - run all 'test*' test methods
in MyTestCase
如有任何帮助,我们将不胜感激。
您的代码正在使用
设置参数解析器
argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
在您的测试方法中 class。但我没有看到代码实际上正在调用该方法的迹象。
所以在你启动程序的时候,解析器还不存在,因为方法TestClass.parse_args()
还没有被调用。
将解析器的创建及其参数的规范移出 class,以便代码在程序启动时调用它。
你是运行unittest.main()
作为主程序。所以它正确地抱怨它不知道你写的选项:
"option -i not recognized"
如果您想创建自己的测试套件启动器,您应该查看
TextTestRunner
此脚本捕获 -i
命令,同时仍允许 unittest.main
执行其自己的命令行解析:
import unittest
class Testclass(unittest.TestCase):
@classmethod
def setUpClass(cls):
print "Hello Class"
def test_addnum(self):
print "Execute the test case"
#parser = parse_args(['-i'])
print 'simple_value =', args.inputfile
import argparse
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
ns, args = parser.parse_known_args(namespace=unittest)
#args = parser.parse_args()
return ns, sys.argv[:1] + args
if __name__ == '__main__':
import sys
args, argv = parse_args() # run this first
print(args, argv)
sys.argv[:] = argv # create cleans argv for main()
unittest.main()
产生:
1113:~/mypy$ python stack44236745.py -i testname -v
(<module 'unittest' from '/usr/lib/python2.7/unittest/__init__.pyc'>, ['stack44236745.py', '-v'])
Hello Class
test_addnum (__main__.Testclass) ... Execute the test case
simple_value = testname
ok
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
它看起来有点笨拙,但确实有效。
想法是先 运行 您自己的解析器,捕获 -i
输入,然后将其余部分放回 sys.argv
。您对 parse_args
的定义表明您已经在尝试这样做。
感谢 hpaulj,您的解决方案对我很有帮助,我找到了解决此问题的另一种方法。希望它能帮助面临同样问题的其他人。
import unittest
import argparse
import sys
class Testclass(unittest.TestCase):
@classmethod
def setUpClass(cls):
print "Hello Class"
def test_addnum(self):
print "Execute the test case"
#parser = parse_args(['-i'])
print 'simple_value =', args.inputfile
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
parser.add_argument('unittest_args', nargs='*')
args = parser.parse_args()
sys.argv[1:] = args.unittest_args
unittest.main()
现在执行带有选项 -i
的脚本作为 python testing.py -i somefile.txt
给出的结果为
Hello Class
Execute the test case
simple_value = somefile.txt
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
我正在使用 unittest 模块在 python 中创建一个测试用例。
我确实创建了一个我想从用户那里得到的解析参数列表。 但是当我在执行 python 脚本时使用该参数时,它会给出错误:“选项 -i 无法识别 用法:testing.py [选项] [测试] [...]"
代码片段:
class Testclass(unittest.TestCase):
@classmethod
def setUpClass(cls):
print "Hello Class"
def test_addnum(self):
print "Execute the test case"
#parser = parse_args(['-i'])
print 'simple_value =', args.inputfile
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
ns, args = parser.parse_known_args(namespace=unittest)
#args = parser.parse_args()
return ns, sys.argv[:1] + args
if __name__ == '__main__':
unittest.main()
使用 -i somefile.txt
执行上述脚本时出现的错误是:
option -i not recognized
Usage: testing.py [options] [test] [...]
Options:
-h, --help Show this message
-v, --verbose Verbose output
-q, --quiet Minimal output
-f, --failfast Stop on first failure
-c, --catch Catch control-C and display results
-b, --buffer Buffer stdout and stderr during test runs
Examples:
testing.py - run default set of tests
testing.py MyTestSuite - run suite 'MyTestSuite'
testing.py MyTestCase.testSomething - run MyTestCase.testSomething
testing.py MyTestCase - run all 'test*' test methods
in MyTestCase
如有任何帮助,我们将不胜感激。
您的代码正在使用
设置参数解析器argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
在您的测试方法中 class。但我没有看到代码实际上正在调用该方法的迹象。
所以在你启动程序的时候,解析器还不存在,因为方法TestClass.parse_args()
还没有被调用。
将解析器的创建及其参数的规范移出 class,以便代码在程序启动时调用它。
你是运行unittest.main()
作为主程序。所以它正确地抱怨它不知道你写的选项:
"option -i not recognized"
如果您想创建自己的测试套件启动器,您应该查看 TextTestRunner
此脚本捕获 -i
命令,同时仍允许 unittest.main
执行其自己的命令行解析:
import unittest
class Testclass(unittest.TestCase):
@classmethod
def setUpClass(cls):
print "Hello Class"
def test_addnum(self):
print "Execute the test case"
#parser = parse_args(['-i'])
print 'simple_value =', args.inputfile
import argparse
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
ns, args = parser.parse_known_args(namespace=unittest)
#args = parser.parse_args()
return ns, sys.argv[:1] + args
if __name__ == '__main__':
import sys
args, argv = parse_args() # run this first
print(args, argv)
sys.argv[:] = argv # create cleans argv for main()
unittest.main()
产生:
1113:~/mypy$ python stack44236745.py -i testname -v
(<module 'unittest' from '/usr/lib/python2.7/unittest/__init__.pyc'>, ['stack44236745.py', '-v'])
Hello Class
test_addnum (__main__.Testclass) ... Execute the test case
simple_value = testname
ok
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
它看起来有点笨拙,但确实有效。
想法是先 运行 您自己的解析器,捕获 -i
输入,然后将其余部分放回 sys.argv
。您对 parse_args
的定义表明您已经在尝试这样做。
感谢 hpaulj,您的解决方案对我很有帮助,我找到了解决此问题的另一种方法。希望它能帮助面临同样问题的其他人。
import unittest
import argparse
import sys
class Testclass(unittest.TestCase):
@classmethod
def setUpClass(cls):
print "Hello Class"
def test_addnum(self):
print "Execute the test case"
#parser = parse_args(['-i'])
print 'simple_value =', args.inputfile
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
parser.add_argument('unittest_args', nargs='*')
args = parser.parse_args()
sys.argv[1:] = args.unittest_args
unittest.main()
现在执行带有选项 -i
的脚本作为 python testing.py -i somefile.txt
给出的结果为
Hello Class
Execute the test case
simple_value = somefile.txt
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK