Вы говорите о тестировании слишком много сразу. Если вы начнете пытаться атаковать проблему тестирования, сказав: «Давайте проверим, правильно ли она изменяет свою среду», вы обречены на неудачу. Среды имеют десятки, а может быть, и миллионы потенциальных вариаций.
Вместо этого посмотрите на части («единицы») вашей программы. Например, вы собираетесь иметь функцию, которая определяет, где находятся файлы, которые должны быть записаны? Каковы входы для этой функции? Возможно переменная окружения, возможно, некоторые значения читаются из файла конфигурации? Протестируйте эту функцию и не делайте ничего, что изменяет файловую систему. Не передавайте ему «реалистичные» значения, передавайте значения, которые легко проверить. Создайте временный каталог, заполните его файлами в методе теста setUp
.
Затем проверьте код, который записывает файлы. Просто убедитесь, что он пишет правильное содержимое файла содержимого. Даже не пишите в настоящую файловую систему! Вам не нужно создавать «поддельные» файловые объекты для этого, просто используйте удобные модули Python StringIO
; это «настоящие» реализации «файлового» интерфейса, они просто не те, в которые ваша программа будет писать.
В конечном итоге вам придется протестировать окончательную функцию верхнего уровня "все, что на самом деле подключено к реальному", которая передает переменную реальной среды и реальный файл конфигурации и объединяет все вместе. Но не беспокойтесь об этом, чтобы начать. Во-первых, вы начнете подбирать трюки, когда будете писать отдельные тесты для небольших функций, и создание тестовых макетов, подделок и заглушек станет для вас второй натурой. С другой стороны: даже если вы не можете понять, как проверить этот вызов одной функции, у вас будет очень высокий уровень уверенности в том, что все, что он вызывает, работает отлично. Кроме того, вы заметите, что разработка на основе тестирования заставляет вас делать свои API более понятными и гибкими. Например: гораздо проще протестировать что-то, что вызывает метод open()
, на объекте, пришедшем откуда-то абстрактно, чем протестировать что-то, что вызывает os.open
в строке, которую вы передаете. Метод open
гибкий; он может быть подделан, он может быть реализован по-другому, но строка - это строка, и os.open
не дает вам никакой возможности поймать, какие методы к ней вызваны.
Вы также можете создавать инструменты тестирования, чтобы упростить выполнение повторяющихся задач. Например, Twisted предоставляет средства для создания временных файлов для тестирования , встроенных прямо в инструмент тестирования . Подобные функциональные возможности нередки для инструментов тестирования или более крупных проектов с собственными библиотеками тестирования.