При модульном тестировании такие вещи, как потоки и файловая система, как правило, должны учитываться. У вас есть причина для модульного тестирования с фактической файловой системой, пользовательским вводом и т. Д.?
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 .