


Если тест должен проверить запись logging, используйте фикстуру caplog. Она даёт доступ к уровню, имени логгера и сообщению. В примере Mentoring.digital проверяется одна учебная запись, а не её случайное оформление в терминале.
import logging
logger = logging.getLogger("app.jobs")
def run_job():
logger.info("job %s ready", "demo")
def test_job_message(caplog):
with caplog.at_level(logging.INFO, logger="app.jobs"):
run_job()
assert ("app.jobs", logging.INFO, "job demo ready") \
in caplog.record_tuplesat_level временно задаёт нужный уровень. После выхода из контекста прежнее значение восстанавливается. В кортеже проверяется уже сформированное сообщение с подставленным аргументом.
caplog.records содержит объекты LogRecord, а record_tuples даёт тройки из имени логгера, уровня и сообщения. caplog.text подходит, когда требуется именно текстовое представление.
Проверка вхождения одной нужной записи устойчивее к посторонним сообщениям, если их отсутствие не является требованием. Когда тест должен запретить любые дополнительные записи, сравнивайте полный ожидаемый набор явно.
caplog.clear() очищает уже захваченные записи перед следующим действием. Данные отдельных стадий теста можно получать через get_records(when), например для setup или teardown.
Проверьте фактический вызов функции, уровень сообщения, имя логгера и его настройки. Обычный вывод через print и запись через logging относятся к разным механизмам захвата.
Фикстура добавляет обработчик к корневому логгеру. Если код полностью перенастраивает его через logging.config.dictConfig, обработчик может исчезнуть. Тогда пустой результат не доказывает, что функция не пыталась записать сообщение.
Практику тестирования можно пройти на курсах QA. Выбрать полезное утверждение для конкретного приложения поможет наставник по тестированию.