我想在我的项目中使用nose
和。coverage
当我用参数运行鼻子时--with-coverage
,我的程序参数解析模块会发疯,因为根据它,“--with-coverage”不是一个真正的参数。
如何关闭 argparse,但仅在测试期间?鼻子说我所有的测试都失败了,因为参数不好。
我想在我的项目中使用nose
和。coverage
当我用参数运行鼻子时--with-coverage
,我的程序参数解析模块会发疯,因为根据它,“--with-coverage”不是一个真正的参数。
如何关闭 argparse,但仅在测试期间?鼻子说我所有的测试都失败了,因为参数不好。
实际上,我前几天自己也遇到了这个问题。你不需要“禁用”你的解析模块或任何东西。您可以做的是更改argparse
用于忽略它收到的那些它无法识别的参数的模块。这样它们仍然可以被其他脚本使用(例如,如果您的命令行调用将辅助参数传递给另一个程序执行)。
如果没有您的代码,我将假设您在实例parse_args()
上使用标准方法。argparse.ArgumentParser
将其替换为parse_known_args()
。
然后,每当您随后引用 parsed-argumentsNamespace
对象时,您都需要指定和元素,特别是 0。虽然parse_args()
单独返回 args 对象,但parse_known_args()
返回元组:第一个元素是已解析的已知参数,后一个元素包含被忽略的无法识别的参数(如有必要,您可以稍后在 Python 代码中使用/传递)。
这是我自己项目的示例更改:
class RunArgs(object):
'''
A placeholder for processing arguments passed to program execution.
'''
def __init__(self):
self.getArgs()
#self.pause = self.args.pause # old assignment
self.pause = self.args[0].pause # new assignment
#...
def __repr__(self):
return "<RunArgs(t=%s, #=%s, v=%s)>" % (str(x) for x in (self.pause,self.numreads,self.verbose))
def getArgs(self):
global PAUSE_TIME
global NUM_READS
parser = argparse.ArgumentParser()
parser.add_argument('-p', '--pause', required=False,
type=self.checkPauseArg, action='store', default=PAUSE_TIME)
parser.add_argument('-n', '--numreads', required=False,
type=self.checkNumArg, action='store', default=NUM_READS)
parser.add_argument('-v', '--verbose', required=False,
action='store_true')
#self.args = parser.parse_args() # old parse call
self.args = parser.parse_known_args() # new parse call
#...
我读过您可以使用nose-testconfig,或者使用mock来替换调用(而不是测试它)。尽管我同意@Ned Batchelder 的观点,但它要求质疑问题的结构。
作为一种解决方法,您可以在当前工作目录中使用.noserc
or ,而不是使用命令行参数运行鼻子:nose.cfg
[nosetests]
verbosity=3
with-coverage=1
不过,我同意这parse_known_args()
是一个更好的解决方案。
听起来您有运行代码的测试,然后您的代码使用 argparse,它隐式地从 sys.argv 中提取参数。这是构建代码的不好方法。您的被测代码应该以其他方式将参数传递给它,以便您可以控制它看到的参数。
这是一个为什么全局变量不好的例子。sys.argv 是全局的,由整个进程共享。通过依赖全局,您限制了代码的模块化,因此也限制了可测试性。