解析unittest python

时间:2017-05-29 07:23:44

标签: python argparse python-unittest

我正在使用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

任何帮助都将不胜感激。

4 个答案:

答案 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