我有一个Python脚本,它执行多个os.system
调用。以字符串列表的形式对其序列进行断言将很容易(而且相对来说比较优雅)。在
不那么容易的是拦截(并阻止)实际的呼叫。在这个剧本里,我可以抽象操作系统在SUT(*)中是这样的:
os_system = None
def main():
return do_the_thing(os.system)
def do_the_thing(os_sys):
global os_system
os_system = os_sys
# all other function should use os_system instead of os.system
当然,我的测试调用my_script.do_the_thing()
而不是my_script.main()
(留下少量未测试的代码)。在
替代选项:在调用SUT中的main()
之前,我可以保持SUT不变,并在测试方法中全局替换{
这给我带来了新的问题,这是一个全球性的、持久的变化。很好,所以我会在同一个测试方法中使用try/finally
,并在离开测试方法之前替换原来的。不管测试方法通过还是失败,这都是有效的。在
但是,对于PyTest,是否有一种安全且优雅的以设置/拆卸为中心的方法呢?在
额外的并发症:我想对stdout和stderr做同样的事情。是的,我正在测试的是一个main()
脚本。在
python3(>;=3.3)标准库在官方文档中有一个great tutorial about Mock。对于python2,可以使用PyPi上的后端口库:Mock。在
下面是一个示例用法。假设您想在这个函数中模拟对
os.system
的调用:为此,可以使用
^{pr2}$unittest.mock.patch
修饰符,如下所示:此测试函数将在执行期间修补
os.system
调用。os.system
将在结尾处还原。在然后,有几个“assert”方法来检查调用、参数和结果。您还可以检查在某些情况下是否引发了异常。在
相关问题 更多 >
编程相关推荐