成功单位测试pyinotify?

Mat*_*ris 3 python synchronization unit-testing pyinotify

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

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

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

Rya*_*rom 5

在单元测试时,通常应该考虑线程和文件系统之类的事情.您是否有理由使用实际文件系统,用户输入等进行单元测试?

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

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

编辑

这是一个如何伪造或模拟"开放"功能的简单示例.

假设你有一个模块my_module,带有一个get_text_upper功能:

def get_text_upper(filename):
    return open(filename).read().upper()
Run Code Online (Sandbox Code Playgroud)

你想在不实际接触文件系统的情况下测试它(最终你将开始只传递文件对象而不是文件名以避免这种情况,但现在......).您可以模拟该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
Run Code Online (Sandbox Code Playgroud)

使用模拟库只会使这个过程更容易,更灵活.

这是关于python的模拟库stackoverflow帖子.