Python 3.8.0, pytest 5.3.2, ведение журнала 0.5.1.2.
Мой код имеет ввод l oop, и для предотвращения полного сбоя программы я улавливаю все исключения, которые получают бросить, зарегистрировать их как критические, сбросить состояние программы и продолжать работу. Это означает, что тест, который вызывает такое исключение, не будет полностью провален, пока результат будет тем, что ожидается. Это может произойти, если ошибка была побочным эффектом тестового кода, но не влияла на основные тестируемые логи c. Я все еще хотел бы знать, что тест выявляет ошибку, вызывающую ошибку, однако.
Большинство выполненных мною поисков показывают результаты о том, как отображать логи в pytest, что я и делаю но я не могу выяснить, есть ли способ представить журналы в тесте, чтобы я мог провалить любой тест с журналом на уровне ошибок или критических.
Редактировать: это минимальное Пример неудачной попытки:
test.py
:
import subject
import logging
import pytest
@pytest.fixture(autouse=True)
def no_log_errors(caplog):
yield # Run in teardown
print(caplog.records)
# caplog.set_level(logging.INFO)
errors = [record for record in caplog.records if record.levelno >= logging.ERROR]
assert not errors
def test_main():
subject.main()
# assert False
subject.py
:
import logging
logger = logging.Logger('s')
def main():
logger.critical("log critical")
Запуск python3 -m pytest test.py
проходит без ошибок. Раскомментирование оператора assert завершает тест без ошибок и печатает []
в стандартный вывод и log critical
в стандартный вывод.
Редактировать 2:
Я обнаружил, почему это не удается. Из документации по caplog:
Атрибут caplog.records содержит записи только текущего этапа, поэтому на этапе настройки он содержит только журналы настройки, то же самое с фазами вызовов и разрыва
Тем не менее, то, что я должен был найти в первый раз:
Чтобы получить доступ к журналам с других этапов, используйте метод caplog.get_records (when). Например, если вы хотите убедиться, что тесты, использующие определенное устройство, никогда не регистрируют какие-либо предупреждения, вы можете проверить записи для этапов настройки и вызова во время разрыва следующим образом:
@pytest.fixture
def window(caplog):
window = create_window()
yield window
for when in ("setup", "call"):
messages = [
x.message for x in caplog.get_records(when) if x.levelno == logging.WARNING
]
if messages:
pytest.fail(
"warning messages encountered during testing: {}".format(messages)
)
Однако это все равно не имеет значения, и print(caplog.get_records("call"))
по-прежнему возвращает []