16.2.8 测试上下文
doctest运行测试时创建的执行上下文包含测试模块中模块级全局变量的一个副本。每个测试源(如函数、类、模块)都有自己的一组全局值,让测试在某种程度上相互隔离,使它们不太可能相互干扰。
class TestGlobals:
def one(self):
"""
>>> var = 'value'
>>> 'var' in globals()
True
"""
def two(self):
"""
>>> 'var' in globals()
False
"""
TestGlobals有两个方法:one()和two()。one()的docstring中的测试设置了一个全局变量,而two()的测试则要查找这个变量(但是应该找不到)。
不过,这并不表示测试不能相互干扰,如果测试要改变模块中定义的可变变量的内容,那么反而要希望它们能交互。
_module_data = {}
class TestGlobals:
def one(self):
"""
>>> TestGlobals().one()
>>> 'var' in _module_data
True
"""
_module_data['var'] = 'value'
def two(self):
"""
>>> 'var' in _module_data
False
"""
one()的测试改变了模块变量_module_data,导致two()的测试失败。
如果测试需要全局值,例如对应一个环境进行参数化,则可以将值传递到testmod()和testfile(),以使用调用者控制的数据建立上下文。