Создание данных для Python тестов - PullRequest
0 голосов
/ 27 мая 2020

Я написал модуль в Python, который считывает пару таблиц из базы данных с помощью метода pd.read_sql, выполняет некоторые операции с данными и записывает результаты обратно в ту же базу данных с помощью метода pd.to_sql.

Теперь мне нужно написать модульные тесты для операций, задействованных в вышеупомянутом модуле. Например, один из тестов проверяет, является ли фрейм данных, полученный из базы данных, пустым, другой проверяет правильность типов данных et c. Как для таких тестов создать образцы данных, отражающие эти ошибки (например, пустой фрейм данных, неправильный тип данных)? Для других модулей, которые не выполняют чтение / запись из базы данных, я создал один образец файла данных (в CSV), прочитал данные, произвел необходимые манипуляции и протестировал различные функции. Для модуля, связанного с операциями с базой данных, как мне (и, что более важно, где мне) создать образцы данных?

Я надеялся создать локальный файл данных (как я делал для тестирования других модулей), а затем прочтите, используя метод read_sql, но это не представляется возможным. Создание локальной базы данных с использованием postegre sql et c возможно, но такие тесты не могут быть развернуты на клиентах, не требуя от них создания таких же локальных баз данных.

Правильно ли я думаю о проблеме или чего-то не хватает?

Спасибо

1 Ответ

0 голосов
/ 27 мая 2020

Ты правильно думаешь о проблеме. Модульные тесты не должны полагаться на существование базы данных, так как это делает их медленнее, сложнее в настройке и требует больше времени.

Существует (по крайней мере) три подхода к описываемой вами задаче:

  1. Первый и, вероятно, лучший в вашем случае - это оставить read_sql и write_sql вне тестируемого кода. Ваш код должен состоять из «базовой» функции, которая принимает фрейм данных и создает другой фрейм данных. Вы можете выполнить модульное тестирование этой основной функции, используя локальные CSV-файлы или любые другие данные, которые вам нравятся. В производстве у вас будет еще одна, очень простая функция, которая просто создает данные с использованием read_sql, передает их «основной» функции, получает результат и записывает его с использованием write_sql. Вы не будете проводить модульное тестирование этой функции-оболочки, но это действительно простая функция, и все должно быть в порядке.

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

  3. Последний вариант и самый сложный - это обезьяна-патч read_sql и write_sql в вашем тесте. Я считаю, что в данном случае это излишество. Вот как это сделать.

    def my_func(sql, con):
        print("I'm here!")
        return "some dummy dataframe"

    pd.read_sql = my_func
    pd.read_sql("select something ...", "dummy_con")
...