Пакет тестирования в зависимости от другого пакета - PullRequest
0 голосов
/ 22 июня 2019

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

У меня есть два пакета; давайте назовем их foo и bar. Для работы пакета bar требуется foo. Теперь я хочу написать тест для bar.

Какое наилучшее / рекомендуемое решение, чтобы убедиться, что foo где-то установлен, чтобы bar мог найти foo при запуске тестов? Это просто установить foo вручную перед тестированием bar?

Примечание. Ни один из пакетов не опубликован в PyPI .

1 Ответ

0 голосов
/ 22 июня 2019

Без дополнительной информации, я предполагаю, что ваша проблема в том, что foo не может быть найдено, когда вы запускаете тесты для bar (например, ValueError: Attempted relative import in non-package). Если это так, то, скорее всего, ваша проблема связана с организацией файла / каталога вашего проекта (решение см. В этом SO post ).

Кроме того, возможно, ваша проблема в том, что у вас нет пакета foo, расположенного в bar в качестве подмодуля. Или, может быть, у вас не установлен foo пункт глобально. Если это так, то вам нужно настроить виртуальную среду (встроенная библиотека venv является односторонней), где foo - это pip. Вы упомянули, что foo отсутствует в PyPi, но если он у вас есть на GitHub, вы можете легко добавить его в requirements.txt, чтобы его можно было установить и установить в вашей виртуальной среде.

Если эти решения не отвечают на ваш вопрос, то, возможно, вы на самом деле спрашиваете, как вы можете контролировать поведение foo, когда тестируется bar? Если это так, то вам следует изучить mocking и / или patching , с помощью которых вы можете создать «поддельный» объект в вашем наборе тестов для имитации и замены другого объекта в вашем программа. В вашем случае вы хотите установить foo, чтобы ваши тесты для bar не зависели от поведения foo. Подобное выделение bar является неотъемлемой частью концепции модульного тестирования.

Если вы используете unittest, есть отличный модуль unittest.mock. unittest.mock предоставляет класс с именем Mock, который вы можете использовать для имитации реальных объектов в вашей кодовой базе. Библиотека также предоставляет функцию с именем patch(), которая заменяет реальные объекты в вашем коде экземплярами Mock. Вы можете использовать patch() в качестве декоратора или диспетчера контекста, что дает вам контроль над областью, в которой объект будет макетироваться. После выхода из указанной области действия patch() очистит ваш код, заменив поддельные объекты их оригинальными аналогами. Я нашел эту статью полезной для начала работы с Mock и patch().

Надеюсь, я как-то ответил на ваш вопрос. Если нет, дайте мне знать, и я могу обновить!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...