嘲笑的最好方法是什么操作系统对于单元测试(PyTest)

2024-06-17 10:04:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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()脚本。在

  • SUT==被测系统

Tags: the字符串脚本列表osmainmydef
1条回答
网友
1楼 · 发布于 2024-06-17 10:04:16

python3(>;=3.3)标准库在官方文档中有一个great tutorial about Mock。对于python2,可以使用PyPi上的后端口库:Mock。在

下面是一个示例用法。假设您想在这个函数中模拟对os.system的调用:

import os


def my_function(src_dir):
    os.system('ls ' + src_dir)

为此,可以使用unittest.mock.patch修饰符,如下所示:

^{pr2}$

此测试函数将在执行期间修补os.system调用。os.system将在结尾处还原。在

然后,有几个“assert”方法来检查调用、参数和结果。您还可以检查在某些情况下是否引发了异常。在

相关问题 更多 >