как сделать так, чтобы вывод assert записывался в файл? - PullRequest
1 голос
/ 21 апреля 2020

Как отправить все методы assert в файл журнала с помощью регистратора? Выход обычно идет к std.err. Возможно, необходимо создать обработчик, но мне не удалось это сделать.

Вот простой пример кода:

#!/usr/bin/python3
import unittest
import logging
import logging.config


# create logger
logging.config.fileConfig('example.conf')
logger = logging.getLogger('examplelogger')

logger.info("test 1")

class TestUpper(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('fooo'.upper(), 'FOO')


if __name__ == '__main__':
    unittest.main()

и файл конфигурации регистратора, который я использовал:

[loggers]
keys=root,examplelogger

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler

[logger_examplelogger]
level=DEBUG
handlers=fileHandler
qualname=examplelogger
propagate=0

[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('example.log', 'w')

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

Результат выполнения кода представлен ниже. Я хотел бы сохранить его (также) в файле журнала.

./example.py 
F
======================================================================
FAIL: test_upper (__main__.TestUpper)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./example.py", line 16, in test_upper
    self.assertEqual('fooo'.upper(), 'FOO')
AssertionError: 'FOOO' != 'FOO'
- FOOO
?    -
+ FOO


----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=1)

1 Ответ

1 голос
/ 21 апреля 2020

Мне очень понравился твой вопрос, я многому учусь в поисках решений,

Я создал декоратор, который, возможно, то, что ты ищешь. Полагаю, я отвечаю на название вашего вопроса, а не на последний заданный вами вопрос. IMO, вам следует задать второй вопрос, потому что это не то же самое.

import unittest
import logging.config
from functools import wraps

def test_logger(logger):
    """
    Decorator for unitest that output assertion Error In a logger file

    :param logger: a logger
    :return:
    """
    def deco(f):
        @wraps(f)
        def wrapper(*args):
            try:
                f(*args)
            except AssertionError as assErr:
                # f_name = (f.__name__) f_name is the function name of the function being decorated could be usefull
                # assErr is the message of the assertion Error
                # you can do more formatting here
                logger.info(assErr)  # send to the log

                raise  # if you don't raise the Error the test will be a success


        return wrapper
    return deco


logging.basicConfig(filename="test.log", level=logging.DEBUG)
logger = logging.getLogger('examplelogger')

logger.info("test 1")


class TestUpper(unittest.TestCase):

    @test_logger(logger)
    def test_upper(self):
        self.assertEqual('fooo'.upper(), 'FOO')


if __name__ == '__main__':
    unittest.main()

Надеюсь, это поможет,

РЕДАКТИРОВАТЬ: После выполнения этого кода создается файл журнала 'test.log 'вот содержимое:

INFO:examplelogger:test 1
INFO:examplelogger:'FOOO' != 'FOO'
- FOOO
?    -
+ FOO

Код захватывает исключение, если оно выдано assert, и помещает его в журнал. это не то, что вы просили?

...