Как перенаправить трассировку ошибок модулей юнит-тестов Python в файл журнала с помощью модуля логирования? - PullRequest
0 голосов
/ 29 июня 2018

У меня есть сценарий тестирования Python, и я пытаюсь перенаправить его вывод (stdout и stderr) как в консоль, так и в файл журнала. Скрипт выдает следующий вывод в консоли, что я и хочу.

test_valid_timerange (testapp.TestApp) ... FAIL
test_has_dashboard_description (testapp.TestApp) ... ok

======================================================================
FAIL: test_valid_timerange (testapp.TestApp)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/himanshu/git/content/test/testapp.py", line 135, in test_valid_timerange
    "%s: panel %s in dashboard %s does not use relative url" % (self.appname, dash.get("name"), panel.get("name")))
AssertionError: Kubernetes: panel Kubernetes - Kube-System in dashboard Pod and Container Running in Kube-System does not use relative url

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)

Но в лог-файле я получаю только это.

2018-06-29 18:29:56,289 [MainThread  ] [INFO ]  Starting Tests for manifestfile: /Users/himanshu/git/content/src/main/app-package/kubernetes/kops/kubernetes.manifest.json appfile: /Users/himanshu/git/content/src/main/app-package/kubernetes/kops/kubernetes.json
2018-06-29 18:29:56,341 [MainThread  ] [INFO ]  testing Kubernetes: test_valid_timerange
2018-06-29 18:29:56,341 [MainThread  ] [INFO ]  testing Kubernetes: test_has_dashboard_description
2018-06-29 18:29:56,342 [MainThread  ] [DEBUG]  Results - Total TestCases: 2 Total Failed: 1

Я знаю, что один из способов сделать это состоит в том, чтобы явно получать сбои и ошибки из результирующего объекта теста и распечатывать их, используя регистратор, обработчик которого выводит только в файл (это потому, что если я использую мой текущий регистратор, он имеет как обработчик потоков, так и обработчик файлов и он будет печатать сообщения об ошибках два раза в консоли). Это мой текущий код

def get_logger():
    log = logging.getLogger(__name__)
    if not log.handlers:

        log.setLevel(logging.DEBUG)
        logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s")

        consoleHandler = logging.StreamHandler(sys.stdout)
        consoleHandler.setFormatter(logFormatter)
        log.addHandler(consoleHandler)

        filehandler = RotatingFileHandler(LOGFILE, maxBytes=(1024*1024*25), backupCount=7)
        filehandler.setFormatter(logFormatter)
        log.addHandler(filehandler)

    return log

logger = get_logger()
suite = unittest.TestSuite()
// using suite.addTest to add tests and using logger in each test function
result = unittest.TextTestRunner().run(suite)

Есть ли другой лучший способ без создания другого регистратора с одним обработчиком? Я ищу альтернативы, такие как передача логгера во время создания набора тестов (unittest.TestSuite (logger = mylogger)) или использование того же логгера, но явная передача аргумента для использования определенного обработчика (logger.info (msg, using = filehandler)) или передать какой-либо аргумент, который останавливает вывод сообщения об ошибке на консоль, и я могу использовать свой собственный регистратор для печати как на консоли, так и в файле.

1 Ответ

0 голосов
/ 02 июля 2018

Я использовал что-то похожее на упомянутое здесь

class LoggerWriter:
    def __init__(self, logger):
        self.logger = logger

    def write(self, message):
        if message != '\n' and message != " ... ":
            self.logger.debug(message)

    def flush(self):
        pass

suite = unittest.TestSuite()
result = unittest.TextTestRunner(stream=LoggerWriter(logger), verbosity=3).run(suite)

P.S. Я до сих пор не знаю, является ли это лучшим способом решения проблемы.

...