2010-10-04 87 views
3

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

  1. 我必须用在我的测试ThreadedNotifier ,否则会 只是挂,等待人工输入。
  2. 因为我正在使用另一个线程,所以我的测试和通告程序不同步。运行观察性手动测试时通过的测试在运行单元测试时失败。

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

回答

5

当单元测试时,线程和文件系统等事情通常应该被分解出来。你有没有理由用实际的文件系统,用户输入等进行单元测试?

Python使猴子很容易修补;例如,你可以用一个模拟对象(例如Python Mock)替换整个os/sys模块,这样你永远不需要处理文件系统。这也将使你的测试运行得更快。

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

编辑

下面是如何捏造的一个简单的例子,或嘲笑的“开放式”的功能。

说你已经有了一个模块,my_module,具有get_text_upper功能:

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

你要测试的这款没有实际触摸文件系统(最终你会开始只是路过文件对象,而不是文件名字,以避免这一点,但现在...)。因此,它返回一个StringIO的对象,而不是你可以嘲笑open功能:

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 

用讽刺库只是使这个过程更容易,更灵活。

这是stackoverflow post on mocking libraries for python

+0

嘲笑是我还没有研究过的,但我现在可能正在穿越那条路。除了上面的链接,还有没有其他好的资源来从概念上学习模拟? – 2010-10-05 00:07:15