Python + нос: сделать утверждения о зарегистрированном тексте? - PullRequest
6 голосов
/ 23 февраля 2011

Есть ли какой-нибудь простой способ захвата и утверждения о зарегистрированных сообщениях с помощью nose?

Например, я хотел бы иметь возможность сделать что-то вроде:

cook_eggs()
assert_logged("eggs are ready!")

Ответы [ 3 ]

12 голосов
/ 23 февраля 2011

Вы можете создать собственный обработчик, который может проверять сообщение, отправляемое через логирование. BufferingHandler идеально подходит для этой работы.

Вы также можете присоединить обработчик в своем тесте к любому регистратору, который вы используете в своем коде, например logging.getLogger('foo').addHandler(...).В конечном итоге вы можете присоединить обработчик к методам setUp и tearDown вашего тестового примера.

import logging
import logging.handlers

class AssertingHandler(logging.handlers.BufferingHandler):

    def __init__(self,capacity):
        logging.handlers.BufferingHandler.__init__(self,capacity)

    def assert_logged(self,test_case,msg):
        for record in self.buffer:
            s = self.format(record)
            if s == msg:
                return
        test_case.assertTrue(False, "Failed to find log message: " + msg)


def cook_eggs():
    logging.warn("eggs are ready!")


import unittest

class TestLogging(unittest.TestCase):

    def test(self):
        asserting_handler = AssertingHandler(10)
        logging.getLogger().addHandler(asserting_handler)
        cook_eggs() 
        asserting_handler.assert_logged(self,"eggs are ready!")
        logging.getLogger().removeHandler(asserting_handler)


unittest.main()
2 голосов
/ 23 февраля 2011

Это то, для чего предназначены «фиктивные объекты».

Вы можете использовать фиктивную версию ведения журнала, которая будет должным образом буферизировать сообщения журнала, чтобы впоследствии вы могли делать о них утверждения.

0 голосов
/ 18 сентября 2015

Просто FWIW, в проекте datalad нам требовались аналогичные функциональные возможности, а также просто проглатывать журналы (и, возможно, самоанализ).Вот и пришло решение - обработчик контекста swallow_logs: https://github.com/datalad/datalad/blob/master/datalad/utils.py#L296 (в настоящее время по адресу b633c9da46ab9cccde3d4767928d167a91857153).Итак, теперь в тесте мы делаем что-то вроде

def test_swallow_logs():
    lgr = logging.getLogger('datalad')
    with swallow_logs(new_level=9) as cm:
        eq_(cm.out, '')
        lgr.log(8, "very heavy debug")
        eq_(cm.out, '')  # not even visible at level 9
        lgr.log(9, "debug1")
        eq_(cm.out, 'debug1\n')  # not even visible at level 9
        lgr.info("info")
        eq_(cm.out, 'debug1\ninfo\n')  # not even visible at level 9
...