用于测试的临时ftp服务器

2024-05-29 07:43:46 发布

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

我想为我的代码编写一个测试,它使用FTP库并通过FTP上传数据。在

我想避免在我的测试中需要一个真正的FTP服务器。在

测试代码最简单的方法是什么?在

有几个边缘的情况,我想测试。在

例如,我的代码试图创建一个已经存在的目录。在

我想捕捉异常并进行适当的错误处理。在

我知道我可以用模仿图书馆。我以前用过。但是对于这个用例也许有更好的解决方案?在

更新为什么我不想做mocking:我知道我可以用mocking来解决这个问题。我可以模仿我使用的库(我使用Stefan Schwarzer的ftputil)并用这种方式测试我的代码。但是如果我以后更改代码并使用不同的FTP库,会发生什么呢?然后我也需要重新编写我的测试代码。我很懒。我希望能够在不接触测试代码的情况下重写我正在测试的真实代码。但也许我还是缺少一个很酷的嘲笑方式。在

https://github.com/tbz-pariv/ftpservercontext求解


Tags: 数据方法代码服务器目录图书馆方式情况
2条回答

先来看看这个还是顺便问一下。你问的不是嘲笑,而是假装。在

  • Fake,接口的实现,它表示正确的行为,但不能用于生产。

  • Mock,一个接口的实现,它基于脚本化的(如电影脚本中的脚本,而不是未编译的代码)响应来响应交互。

  • 存根(Stub),接口的实现,缺少任何实际实现。通常用于mcguffin风格的测试。

请注意,在每种情况下都使用“接口”一词。在

您的问题是如何伪造一个TCP端口,使其行为是一个FTP服务器,下面是rw文件系统的状态。在

这很难。在

模拟调用mkdir函数时抛出的内部接口要容易得多。在

如果你必须伪造一个FTP服务器。我建议创建一个docker容器,服务器处于您想要的状态,并使用docker来处理FTP服务器的重复性和生命周期。在

上下文管理器:

class FTPServerContext(object):

    banner = 'FTPServerContext ready'

    def __init__(self, directory_to_serve):
        self.directory_to_serve = directory_to_serve

    def __enter__(self):
        cmd = ['serve_directory_via_ftp']
        self.pipe = subprocess.Popen(cmd, cwd=self.directory_to_serve)
        time.sleep(2) # TODO check banner via https://stackoverflow.com/a/4896288/633961

    def __exit__(self, *args):
        self.pipe.kill()

控制台脚本:

^{pr2}$

测试中的用法:

def test_execute_job_and_create_log(self):
    temp_dir = tempfile.mkdtemp()
    with testutils.FTPServerContext(temp_dir) as ftp_context:
        execute_job_and_create_log(...)

代码在您想要的任何许可下都在公共域中。如果您将此程序包设置为pip可安装程序包,那就太好了pypi.org网站. 在

相关问题 更多 >

    热门问题