python - 成功单元测试pyinotify?

标签 python unit-testing synchronization pyinotify

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

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

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

最佳答案

单元测试时,线程和文件系统之类的东西通常应该被排除在外。您是否有理由对实际文件系统、用户输入等进行单元测试?

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

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

编辑

这是一个如何伪造或模拟“打开”功能的简单示例。

假设你有一个模块,my_module,带有一个 get_text_upper 函数:

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

使用模拟库只会让这个过程变得更加简单和灵活。

这是一个 stackoverflow post on mocking libraries for python .

关于python - 成功单元测试pyinotify?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3852935/

相关文章:

node.js - 仅对 Node 中的 chai-http 单元测试进行 1 个 http 调用?

django - 是否有模拟 Django 模型的标准方法?

amazon - 同步 S3 存储桶

python - 如何使用 Python 和 Selenium 将击键发送到 Firefox 来保存网页图像

python - 如何释放对象中的 Python 列表?

c# - NUnit 单元测试有 "ExpectedException"但仍然因异常而失败

java - Java中的同步类(即Monitor)

python - 在单元测试中比较 numpy float 数组

python - 在 For 循环中从 Windows 批处理文件中的数组访问项目

android - 与 SyncAdapter 的同步如何在 android 上工作?