Модификации файла поблочного тестирования

При использовании кода cf.go_offline(), как и ожидалось:

import plotly.offline as py
import plotly.graph_objs as go
import pandas as pd
import cufflinks as cf

cf.go_offline()

df0 = pd.DataFrame({"fruits": ["apple", "mango", "lime"],
                    "number of sold items": [20, 26, 32]})

df0["fruits"].iplot(kind="scatter", filename="lineplot-with-cufflinks")

Вывод: Simple plot

22
задан Schof 20 September 2008 в 01:56
поделиться

6 ответов

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

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

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

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

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

14
ответ дан 29 November 2019 в 05:24
поделиться

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

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

  2. Операции файловой системы. Создайте, скопируйте, переименуйте, удалите, резервное копирование. Извините, но те - надлежащие операции файловой системы, которые - хорошо - требуют надлежащей файловой системы для тестирования.

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

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

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

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

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

7
ответ дан 29 November 2019 в 05:24
поделиться

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

я сделал это в Java, и я предполагаю, что это довольно просто в Python..., но это может потребовать разработки Ваших классов/функций таким способом, которым ЛЕГКО дразнить использование фактического файла.

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

2
ответ дан 29 November 2019 в 05:24
поделиться

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

, Если это не работает тогда, Вы могли бы записать свои сценарии для взятия 'корневого' пути в качестве аргумента.

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

1
ответ дан 29 November 2019 в 05:24
поделиться

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

1
ответ дан 29 November 2019 в 05:24
поделиться

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

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
3
ответ дан 29 November 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: