带有传递参数的python unittest -b

时间:2017-10-09 14:34:04

标签: python unit-testing python-3.6

快速摘要:在python中获取unittest以获取cmd行参数并使用-b标志运行测试

我在名为filetool.py

的文件中有以下代码
def get_passedargdict():
    '''need a place to setup args'''
    parser = argparse.ArgumentParser(description="pass me some data")
    parser.add_argument("-skipmd5", "--skipmd5", help="skip the md5 check", required=False)
    parser.add_argument("-keepinput", "--keepinput", help="copy instead of moving the input file", required=False)
    parser.add_argument("-keepconfig", "--keepconfig", help="copy instead of moving the config file", required=False)
    passedargs = parser.parse_args()
    passedargdict = {}

    if passedargs.skipmd5 == "y":
        passedargdict["skipmd5"] = True
    else:
        passedargdict["skipmd5"] = False

    if passedargs.keepinput == "y":
        passedargdict["keepinput"] = True
    else:
        passedargdict["keepinput"] = False

    if passedargs.keepconfig == "y":
        passedargdict["keepconfig"] = True
    else:
        passedargdict["keepconfig"] = False

    return passedargdict

非常直接,工作正常。我接受命令行的东西,并将其填入字典。现在我想使用:

添加一个非常基本的单元测试(我已经有许多工作了)
import unittest

在一个名为test_filetools.py的文件中,这有效:

def test_get_passedargdict(self):
    passedargdict = get_passedargdict()
    self.assertFalse(passedargdict["keepinput"])
    self.assertFalse(passedargdict["keepconfig"])
    self.assertFalse(passedargdict["skipmd5"])

我可以跑:

test_filetools.py

它很棒。我热爱生活。但是我在这里有很多单元测试,我不想要屏幕上的所有垃圾邮件我只想要小点,所以我试过了:

test_filetools.py -b

我失败了:

Stderr:
usage: test_filetools.py [-h] [-skipmd5 SKIPMD5] [-keepinput KEEPINPUT]
                         [-keepconfig KEEPCONFIG]
test_filetools.py: error: unrecognized arguments: -b

所以看起来我的get_passedargdict()试图拉入-b。 如果我对该单元进行测试,则所有运行正常--b

我有什么想法可以让这个单元测试接收参数并且能够同时使用-b选项而不会导致这种失败?谢谢!

1 个答案:

答案 0 :(得分:0)

看起来我自己的帖子有点像骗子所以我会自己回答!这篇文章看起来有很多选择:

https://stackoverflow.com/a/18184016/5894241

我用make函数取args,并在实际代码中将命令行的东西传递给它,在测试硬编码中将其清空。

以下是我为测试而改变的内容:

def test_get_passedargdict(self):
    passedargdict = get_passedargdict([])
    self.assertFalse(passedargdict["keepinput"])
    self.assertFalse(passedargdict["keepconfig"])
    self.assertFalse(passedargdict["skipmd5"])

我现在的实际代码是这样的:

passedargdict = get_passedargdict(sys.argv[1:])

和功能:

def get_passedargdict(args):
    '''need a place to setup args'''
    parser = argparse.ArgumentParser(description="pass me some data")
    parser.add_argument("-skipmd5", "--skipmd5", help="skip the md5 check", required=False)
    parser.add_argument("-keepinput", "--keepinput", help="copy instead of moving the input file", required=False)
    parser.add_argument("-keepconfig", "--keepconfig", help="copy instead of moving the config file", required=False)
    passedargs = parser.parse_args(args)
    passedargdict = {}

    if passedargs.skipmd5 == "y":
        passedargdict["skipmd5"] = True
    else:
        passedargdict["skipmd5"] = False

    if passedargs.keepinput == "y":
        passedargdict["keepinput"] = True
    else:
        passedargdict["keepinput"] = False

    if passedargs.keepconfig == "y":
        passedargdict["keepconfig"] = True
    else:
        passedargdict["keepconfig"] = False

    return passedargdict