Skip to main content
 首页 » 编程设计

python之在 unittest python 中解析命令行参数

2025年05月04日12think

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

如有任何帮助,我们将不胜感激。

请您参考如下方法:

此脚本捕获 -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 的定义表明您已经在尝试这样做。