测试单例选项模块

时间:2017-02-03 22:33:35

标签: python unit-testing singleton

最近,我发现模块在Python中是单例。这很好,因为在某些情况下,这种模式很有用。

就个人而言,我喜欢在各地共享的模块中使用它,比如选项。

例如,这是一个使用argparse的非常简单的选项模块:

#options.py
import argparse

parser = argparse.ArgumentParser(prog='myoptions')
parser.add_argument('-c', action='store')
options = parser.parse_args()

每当我import options时,代码执行一次,变量options包含解析的所有选项。很棒!

除了现在,我想测试一下。但是我编写它的方式使它很难测试它:

  • 当我在我的测试文件中导入模块时,argparse尝试解析argv,但失败了,因为argv是来自unittest的
  • 由于它只加载并执行一次,我只能测试选项模块的一部分。多次导入options不起作用。

我可以通过在函数中包含parse_args调用并在每个单元测试中调用此函数来快速解决此问题。但是,在我的“真实”代码中,每当我需要一个选项时,我将必须导入options模块,然后执行“wrap function”,它将解析参数并给我选项。

这是可行的,但它并不漂亮,因为:

  • 我必须在任何需要选项
  • 的模块中导入+调用“解析”功能
  • 每次都会执行argv的解析,而正常情况下,它应执行一次。

那么,我如何使这个代码既可以单元测试又易于使用?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

经过一番研究后,似乎没有明显的解决方案。

在所有可能性中,我决定在解析变量时放置一个小if

if os.environ.get('UNITTEST', 0):
    options = None
else:
    options = _parser.parse_args()

然后,我在unittest文件中提供env变量UNITTEST=1并在单元测试函数中进行解析。这允许我手动提供parse_args来测试我的选项,当程序执行时,选项会立即被解析。