Python 测试单例选项模块
最近,我发现Python中的模块是单例的。这很好,因为在某些情况下,这种模式很有用 就个人而言,我喜欢在到处共享的模块中使用它,比如选项 例如,下面是一个使用argparse的非常简单的选项模块:Python 测试单例选项模块,python,unit-testing,singleton,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()
#options.py
import argparse
parser = argparse.ArgumentParser(prog='myoptions')
parser.add_argument('-c', action='store')
options = parser.parse_args()
每当我导入选项时,代码执行一次,变量options
包含所有解析的选项。太好了
除了现在,我想测试一下。但我编写代码的方式使得测试非常困难:
- 当我在测试文件中导入模块时,argparse尝试解析argv,但它失败了,因为argv是来自unittest的
- 因为它只被加载和执行一次,所以我只能测试选项模块的一部分。多次导入
无效选项
parse_args
调用包装到函数中并在每个单元测试中调用该函数,我可以很快地解决这个问题。但是,在我的“real”代码中,每当我需要一个选项时,我都必须导入options模块,然后执行“wrap函数”,该函数将解析参数并为我提供选项
这是可行的,但并不漂亮,因为:
- 我必须在任何需要选项的模块中导入并调用“parse”函数
- 它将每次执行
的解析,而正常情况下,它应该执行一次argv
谢谢你的帮助 经过一点研究,似乎没有明显的解决办法 在所有的可能性中,我决定在变量的解析中加入一个小的
if
:
if os.environ.get('UNITTEST', 0):
options = None
else:
options = _parser.parse_args()
然后,我在UNITTEST文件中输入一个env vars
UNITTEST=1
,并在单元测试函数中进行解析。这允许我手动输入parse_args
来测试我的选项,当程序执行时,选项会立即被解析。很抱歉,可能是重复的,但这不是重复,至少不是直接的。如果更改sys.argv,它将工作,但仅用于一个测试,因为代码导入/执行一次。我知道是因为我试过:)