成功的单元测试pyinotify?

我正在使用pyinotify将文件从源目录镜像到目标目录.当我手动执行代码时,我的代码似乎可以正常工作,但是我无法获得准确的单元测试结果.我认为问题可以归结为:

>我必须使用ThreadedNotifier
在我的测试中,否则他们会
刚挂起,等待手动输入.
>因为我正在使用另一个线程,所以我的测试和通知程序不同步.运行观察性测试时通过的测试,手动测试在运行单元测试时失败.

有没有人成功进行单元测试pyinotify?

解决方法:

在进行单元测试时,通常应将诸如线程和文件系统之类的因素排除在外.您是否有理由对实际文件系统,用户输入等进行单元测试?

Python使猴子补丁变得非常容易.例如,您可以将整个os / sys模块替换为模拟对象(例如Python Mock),这样就不再需要处理文件系统了.这也将使您的测试运行更快.

如果要对文件系统进行功能测试,建议您设置一个具有已知状态的虚拟机,并在每次运行测试时将其恢复为该状态.您还可以根据需要模拟用户输入,文件操作等.

编辑

这是有关如何伪造或模拟“开放”功能的简单示例.

假设您有一个带有get_text_upper函数的模块my_module:

def get_text_upper(filename):
    return open(filename).read().upper()

您想要在不实际接触文件系统的情况下进行测试(最终,您将只通过传递文件对象而不是文件名来避免这种情况,但是现在……).您可以模拟open函数,以便它返回StringIO对象:

from cStringIO import StringIO

def fake_open(text):
    fp = StringIO()
    fp.write(text)
    fp.seek(0)
    return fp

def test_get_text():
    my_module.open = lambda *args, **kwargs : fake_open("foo")
    text = my_module.get_text_upper("foo.txt")
    assert text == "FOO", text

使用模拟库只会使此过程变得更加容易和灵活.

这是* post on mocking libraries for python.

上一篇:java-高效的缓存同步


下一篇:如何在PHP中处理查询同步?