Успешное юнит-тестирование pyinotify? - PullRequest
3 голосов
/ 04 октября 2010

Я использую pyinotify для зеркалирования файлов из исходного каталога в каталог назначения. Мой код, кажется, работает, когда я выполняю его вручную, но у меня возникают проблемы с получением точных результатов модульного теста. Я думаю, что проблема сводится к этому:

  1. Мне нужно использовать ThreadedNotifier в моих тестах, иначе они будут просто повесить, ожидая ручного ввода.
  2. Поскольку я использую другой поток, мои тесты и программа оповещения не синхронизированы. Тесты, которые проходят при выполнении наблюдательных, ручные тесты не выполняются при выполнении модульных тестов.

Кто-нибудь преуспел в модульном тестировании pyinotify?

1 Ответ

5 голосов
/ 04 октября 2010

При модульном тестировании такие вещи, как потоки и файловая система, как правило, должны учитываться. У вас есть причина для модульного тестирования с фактической файловой системой, пользовательским вводом и т. Д.?

Python делает очень простой патч для обезьян; Например, вы можете заменить весь модуль os / sys на фиктивный объект (например, Python Mock ), чтобы вам никогда не приходилось иметь дело с файловой системой. Это также сделает ваши тесты намного быстрее.

Если вы хотите провести функциональное тестирование с файловой системой, я бы порекомендовал настроить виртуальную машину, которая будет иметь известное состояние, и возвращаться к этому состоянию при каждом запуске тестов. Вы также можете имитировать пользовательский ввод, файловые операции и т. Д. При необходимости.

1009 ** * Редактировать 1010 ** * 1011

Вот простой пример того, как подделать или смоделировать функцию «open».

Скажем, у вас есть модуль, 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 о библиотеках-макетах для python .

...