我正在使用unittest模块在python中创建一个测试用例。
我确实创建了一个我想从用户那里获得的解析参数列表。 但是当我在执行python脚本时使用该参数时,它会给出错误:“选项-i无法识别 用法:testing.py [options] [test] [...]“
代码段:
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
任何帮助都将不胜感激。
答案 0 :(得分:5)
此脚本捕获-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
的定义表明您已经尝试这样做了。
答案 1 :(得分:2)
感谢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
答案 2 :(得分:0)
您的代码正在使用
设置参数解析器argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
在您的测试类的方法中。但我没有看到代码实际调用该方法的迹象。
因此,在您启动程序时,解析器尚不存在,因为尚未调用方法TestClass.parse_args()
。
将解析器的创建及其参数的规范移出类,以便代码在程序启动时调用它。
答案 3 :(得分:0)
您正在运行unittest.main()
作为主程序。所以它正当地抱怨说它不知道你写的选项:
"option -i not recognized"
如果你想创建自己的测试套件启动器,你应该研究一下 TextTestRunner