Не секрет, что Flask и так хорошо дружит с nosetests, но до сегодняшнего дня был один очень раздражющий момент в их взаимоотношениях :)
Как мы все знаем nosetests по дефолту захватывает все из stdout/stderr и логгинга, чтоб при запуске тестов вывод не засорялся ненужной нам информацией. Однако в дебаг-моде Flask кладет на всех и устанавливает с помощью flask.logging.create_logger
функции хэндлер, который начинает срать в консоль при каждом удобном случае, причем минуя все ранее установленные хэндлеры. Итог: куча ненужной логгинг информации при запуске тестов как:
(env)$ TESTING=1 nosetets -c -v -w <package>
Не хорошо, но In mock we trust, так что все что надо - это замокать упомянутую выше функцию в случае, когда мы запускаем тесты в дебаг-моде:
if TESTING and DEBUG:
from flask import logging as flask_logging
def mock_create_logger(app):
return logging.getLogger(app.logger_name)
flask_logging.create_logger = mock_create_logger
Помещаем этот сниппет в settings.py
, затем не забываем загрузить настройки как import settings; app.config.from_object(settings)
в нашем app.py
- и получаем счастье, nosetests уверенно захватывает все нужное и вывод тестов чист и аккуратен.
Полный гист доступен на Гитхабе, если кто-то готов предложить более красивый вариант решения проблемы - жду в комментариях.