У меня есть сценарий тестирования 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)) или передать какой-либо аргумент, который останавливает вывод сообщения об ошибке на консоль, и я могу использовать свой собственный регистратор для печати как на консоли, так и в файле.