Модификации файлов модулей

Общая задача в программах, над которыми я работала в последнее время, – это каким-то образом изменить текстовый файл. (Привет, я нахожусь в Linux. Все это файл. И я делаю крупномасштабный системный администратор.)

Но файл, который изменяет код, может отсутствовать на моем рабочем столе. И я, вероятно, не хочу его изменять, если это на моем рабочем столе.

Я читал об модульном тестировании в Dive Into Python, и довольно ясно, что я хочу сделать, тестируя приложение, которое преобразует десятичные числа в Roman Numerals (пример в DintoP). Тестирование хорошо самодостаточно. Вам не нужно проверять правильность программы PRINTS, вам просто нужно убедиться, что функции возвращают правильный вывод на заданный вход.

В моем случае, однако, нам нужно проверить, что программа правильно модифицирует свою среду. Вот что я придумал:

1) Создайте «оригинальный» файл в стандартном местоположении, возможно, / tmp.

2) Запустите функцию, которая изменяет файл, передавая ему путь к файлу в / tmp.

3) Убедитесь, что файл в / tmp был правильно изменен; соответственно.

Это кажется мне клочковым. (Получает даже kludgier, если вы хотите убедиться, что резервные копии файла созданы правильно и т. Д.). Кто-нибудь придумал лучший способ?

6 Solutions collect form web for “Модификации файлов модулей”

Вы говорите об испытании слишком много сразу. Если вы начнете пытаться атаковать проблему тестирования, сказав: «Давайте проверим, правильно ли он изменяет ее среду», вы обречены на провал. В средах есть десятки, а может быть, и миллионы потенциальных изменений.

Вместо этого просмотрите фрагменты («единицы») вашей программы. Например, у вас будет функция, определяющая, где файлы должны быть записаны? Какие входы в эту функцию? Возможно, переменная среды, возможно, некоторые значения читаются из файла конфигурации? Протестируйте эту функцию и фактически не делайте ничего, что изменяет файловую систему. Не передавайте его «реалистичные» значения, передайте ему значения, которые легко проверить. Создайте временный каталог, setUp его файлами в методе setUp вашего теста.

Затем проверьте код, который записывает файлы. Просто убедитесь, что он пишет правильное содержимое содержимого содержимого. Даже не пишите в настоящую файловую систему! Для этого вам не нужно создавать «поддельные» файловые объекты, просто используйте удобные модули StringIO Python; они являются «реальными» реализациями «файлового» интерфейса, они просто не те, на которые на самом деле будет писать ваша программа.

В конечном итоге вам придется протестировать последнюю, все-на-самом-подключенную для реального уровня функцию верхнего уровня, которая передает реальную переменную среды и реальный файл конфигурации и объединяет все вместе. Но не беспокойтесь об этом, чтобы начать. Во-первых, вы начнете собирать трюки, когда вы пишете индивидуальные тесты для небольших функций, а создание тестовых макетов, подделок и заглушек станет для вас второй натурой. Для другого: даже если вы не можете понять, как проверить этот вызов функции, у вас будет очень высокий уровень уверенности в том, что все, что он вызывает, отлично работает. Кроме того, вы заметите, что разработка, основанная на тестах, заставляет вас сделать ваши API более четкими и гибкими. Например: гораздо проще протестировать что-то, что вызывает метод open() для объекта, который откуда-то был абстрактным, чем для проверки того, что вызывает os.open на строке, которую вы передаете. open метод является гибким; его можно подделать, его можно реализовать по-разному, но строка – это строка, а os.open не дает вам никакой возможности поймать, какие методы вызывают на ней.

Вы также можете создавать инструменты тестирования, чтобы упростить выполнение повторяющихся задач. Например, скрученный предоставляет средства для создания временных файлов для тестирования, встроенных в инструмент тестирования . Это не редкость для инструментов тестирования или более крупных проектов с их собственными тестовыми библиотеками, чтобы иметь такую ​​функциональность.

У вас есть два уровня тестирования.

  1. Фильтрация и изменение содержимого. Это «низкоуровневые» операции, которые не требуют физического ввода-вывода. Это тесты, принятие решений, альтернативы и т. Д. «Логика» приложения.

  2. Операции файловой системы. Создание, копирование, переименование, удаление, резервное копирование. Извините, но это правильные операции с файловой системой, которые – ну и требуют правильной файловой системы для тестирования.

Для такого тестирования мы часто используем объект «Mock». Вы можете создать класс «FileSystemOperations», который воплощает различные операции с файловой системой. Вы проверяете это, чтобы убедиться, что он выполняет базовое чтение, запись, копирование, переименование и т. Д. В этом нет реальной логики. Просто методы, которые вызывают операции файловой системы.

Затем вы можете создать MockFileSystem, которая маскирует различные операции. Вы можете использовать этот объект Mock для тестирования других классов.

В некоторых случаях все операции с файловой системой находятся в модуле os. Если это так, вы можете создать модуль MockOS с макетной версией операций, которые вы фактически используете.

Поместите ваш модуль MockOS на PYTHONPATH и вы можете скрыть реальный модуль ОС.

Для производственных операций вы используете хорошо проверенные классы «Логика» плюс ваш класс FileSystemOperations (или настоящий модуль ОС).

Для более поздних читателей, которые просто хотят проверить, правильно ли написано, что запись кода в файлы работает, вот «fake_open», который исправляет открытую встроенную часть модуля для использования StringIO. fake_open возвращает файл открытых файлов, который может быть проверен в модульном тесте или доктрине, без реальной файловой системы.

 def fake_open(module): """Patch module's `open` builtin so that it returns StringIOs instead of creating real files, which is useful for testing. Returns a dict that maps opened file names to StringIO objects.""" from contextlib import closing from StringIO import StringIO streams = {} def fakeopen(filename,mode): stream = StringIO() stream.close = lambda: None streams[filename] = stream return closing(stream) module.open = fakeopen return streams 

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

Я сделал это на Java, и я думаю, что это довольно просто в Python … но это может потребовать разработки ваших классов / функций таким образом, чтобы EASY издеваться над использованием фактического файла.

Для этого вы можете попробовать передать потоки, а затем просто передать простой поток ввода / вывода строки, который не будет записывать в файл, или иметь функцию, которая выполняет фактическую «запись этой строки в файл» или «читать строка из файла ", а затем замените эту функцию в своих тестах.

Я думаю, что ты на правильном пути. В зависимости от того, что вам нужно сделать, chroot может помочь вам настроить среду для ваших scrpits, которая «выглядит» реальной, но это не так.

Если это не сработает, вы можете написать свои сценарии, чтобы использовать «корневой» путь в качестве аргумента.

В производственном прогоне корневой путь равен /. Для тестирования вы создаете теневую среду в / tmp / test, а затем запускаете свои скрипты с корневым путем / tmp / test.

Возможно, вы захотите установить тест, чтобы он работал внутри тюрьмы chroot, поэтому у вас есть вся среда, в которой нуждается тест, даже если пути и места файлов жестко закодированы в коде [не очень хорошая практика, но иногда получается файл местоположения из других мест …], а затем проверить результаты с помощью кода выхода.

  • python высмеивает сторонние модули
  • Python, unit test - передать аргументы командной строки setUp unittest.TestCase
  • assertRaises не удается, даже вызываемый вызывает требуемое исключение (python, unitest)
  • Тестирование загрузки файлов с помощью Flask и Python 3
  • Как проверить макет звонков с помощью подстановочных знаков?
  • Как проверить метод, требующий наличия файла?
  • Тестирование с помощью Scrapy Unit
  • py.test не может импортировать мой модуль
  • Доски Django в views.py
  • Почему factory_boy лучше использовать ORM непосредственно в тестах?
  • Как мне высмеять метод Python OptionParser.error (), который делает sys.exit ()?
  • Python - лучший язык программирования в мире.