У меня есть скрипт Python, который объединяет отчеты с использованием Pandas в последовательности операций DataFrame (drop, groupby, sum и т. Д.). Скажем, я начинаю с простой функции, которая очищает все столбцы, у которых нет значений, у нее есть DataFrame в качестве ввода и вывода:

# cei.py
def clean_table_cols(source_df: pd.DataFrame) -> pd.DataFrame:
   # IMPLEMENTATION
   # eg. return source_df.dropna(axis="columns", how="all")

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

# test_cei.py
import pandas as pd
def test_clean_table_cols() -> None:
    df = pd.DataFrame(
        {
            "full_valued": [1, 2, 3],
            "all_missing1": [None, None, None],
            "some_missing": [None, 2, 3],
            "all_missing2": [None, None, None],
        }
    )
    expected = pd.DataFrame({"full_valued": [1, 2, 3], "some_missing": [None, 2, 3]})
    result = cei.clean_table_cols(df)
    pd.testing.assert_frame_equal(result, expected)

Мой вопрос в том, является ли это концептуально модульным тестом или тестом e2e / интеграции, поскольку я не издеваюсь над реализацией pandas. Но если я издеваюсь над DataFrame, я не буду тестировать функциональность кода. Каков рекомендуемый способ протестировать этот следующий передовой опыт TDD?

Примечание: использование Pandas в этом проекте является дизайнерским решением, поэтому нет намерения специально абстрагировать интерфейсы Pandas, чтобы, возможно, заменить его другой библиотекой в ​​будущем.

2
staticdev 18 Апр 2020 в 18:11

2 ответа

Лучший ответ

Да, этот код по сути является интеграционным тестом, что, возможно, неплохо.

Даже если использование pandas является фиксированным дизайнерским решением, есть еще много веских причин абстрагироваться от внешних библиотек. Тестирование - одна из них. Абстрагирование от внешних библиотек позволяет тестировать бизнес-логику независимо от библиотек. В этом случае абстрагирование от панд сделало бы вышеуказанное модульным тестом. Он проверит взаимодействие с библиотекой .

Чтобы применить этот шаблон, я рекомендую взглянуть на образец архитектуры портов и адаптеров

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

0
Joost Papendorp 8 Июн 2020 в 12:56

Вы можете найти tdda (анализ данных на основе тестирования) полезным, цитируя из документы:

Пакет tdda обеспечивает поддержку Python для анализа данных на основе тестов (см. Одностраничное резюме со ссылками или блог). Библиотека tdda.referencetest используется для поддержки создания эталонных тестов на основе unittest или pytest. Библиотека tdda.constraints используется для обнаружения ограничений из (Pandas) DataFrame, записи их как JSON и проверки соответствия наборов данных ограничениям в файле ограничений. Он также поддерживает таблицы в различных базах данных отношений. Существует также служебная программа командной строки для обнаружения и проверки ограничений и обнаружения ошибочных записей. Библиотека tdda.rexpy - это инструмент для автоматического вывода регулярных выражений из столбца в Pandas DataFrame или из списка примеров (Python). Также существует утилита командной строки для Rexpy. Хотя библиотека предоставляется в виде пакета Python и может быть вызвана через API Python, она также предоставляет инструменты командной строки ».

См. Также доклад Ника Рэдклиффа в PyData об анализе данных на основе тестов

0
rdmolony 29 Июл 2020 в 14:51