parent
aca1b06747
commit
8d735f3e1d
|
@ -2,7 +2,6 @@ from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from contextlib import closing, contextmanager
|
from contextlib import closing, contextmanager
|
||||||
import sys
|
|
||||||
import six
|
import six
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -270,30 +269,13 @@ class LoggingPlugin(object):
|
||||||
The formatter can be safely shared across all handlers so
|
The formatter can be safely shared across all handlers so
|
||||||
create a single one for the entire test session here.
|
create a single one for the entire test session here.
|
||||||
"""
|
"""
|
||||||
|
self._config = config
|
||||||
self.print_logs = get_option_ini(config, 'log_print')
|
self.print_logs = get_option_ini(config, 'log_print')
|
||||||
self.formatter = logging.Formatter(
|
self.formatter = logging.Formatter(
|
||||||
get_option_ini(config, 'log_format'),
|
get_option_ini(config, 'log_format'),
|
||||||
get_option_ini(config, 'log_date_format'))
|
get_option_ini(config, 'log_date_format'))
|
||||||
self.log_level = get_actual_log_level(config, 'log_level')
|
self.log_level = get_actual_log_level(config, 'log_level')
|
||||||
|
|
||||||
if config.getini('log_cli'):
|
|
||||||
log_cli_handler = logging.StreamHandler(sys.stderr)
|
|
||||||
log_cli_format = get_option_ini(
|
|
||||||
config, 'log_cli_format', 'log_format')
|
|
||||||
log_cli_date_format = get_option_ini(
|
|
||||||
config, 'log_cli_date_format', 'log_date_format')
|
|
||||||
log_cli_formatter = logging.Formatter(
|
|
||||||
log_cli_format,
|
|
||||||
datefmt=log_cli_date_format)
|
|
||||||
log_cli_level = get_actual_log_level(config, 'log_cli_level', 'log_level')
|
|
||||||
self.log_cli_handler = log_cli_handler # needed for a single unittest
|
|
||||||
self.live_logs_context = catching_logs(log_cli_handler,
|
|
||||||
formatter=log_cli_formatter,
|
|
||||||
level=log_cli_level)
|
|
||||||
else:
|
|
||||||
self.log_cli_handler = None
|
|
||||||
self.live_logs_context = _dummy_context_manager()
|
|
||||||
|
|
||||||
log_file = get_option_ini(config, 'log_file')
|
log_file = get_option_ini(config, 'log_file')
|
||||||
if log_file:
|
if log_file:
|
||||||
self.log_file_level = get_actual_log_level(config, 'log_file_level')
|
self.log_file_level = get_actual_log_level(config, 'log_file_level')
|
||||||
|
@ -352,6 +334,7 @@ class LoggingPlugin(object):
|
||||||
@pytest.hookimpl(hookwrapper=True)
|
@pytest.hookimpl(hookwrapper=True)
|
||||||
def pytest_runtestloop(self, session):
|
def pytest_runtestloop(self, session):
|
||||||
"""Runs all collected test items."""
|
"""Runs all collected test items."""
|
||||||
|
self._setup_cli_logging()
|
||||||
with self.live_logs_context:
|
with self.live_logs_context:
|
||||||
if self.log_file_handler is not None:
|
if self.log_file_handler is not None:
|
||||||
with closing(self.log_file_handler):
|
with closing(self.log_file_handler):
|
||||||
|
@ -360,3 +343,27 @@ class LoggingPlugin(object):
|
||||||
yield # run all the tests
|
yield # run all the tests
|
||||||
else:
|
else:
|
||||||
yield # run all the tests
|
yield # run all the tests
|
||||||
|
|
||||||
|
def _setup_cli_logging(self):
|
||||||
|
"""Setups the handler and logger for the Live Logs feature, if enabled.
|
||||||
|
|
||||||
|
This must be done right before starting the loop so we can access the terminal reporter plugin.
|
||||||
|
"""
|
||||||
|
terminal_reporter = self._config.pluginmanager.get_plugin('terminalreporter')
|
||||||
|
if self._config.getini('log_cli') and terminal_reporter is not None:
|
||||||
|
log_cli_handler = logging.StreamHandler(terminal_reporter._tw)
|
||||||
|
log_cli_format = get_option_ini(
|
||||||
|
self._config, 'log_cli_format', 'log_format')
|
||||||
|
log_cli_date_format = get_option_ini(
|
||||||
|
self._config, 'log_cli_date_format', 'log_date_format')
|
||||||
|
log_cli_formatter = logging.Formatter(
|
||||||
|
log_cli_format,
|
||||||
|
datefmt=log_cli_date_format)
|
||||||
|
log_cli_level = get_actual_log_level(self._config, 'log_cli_level', 'log_level')
|
||||||
|
self.log_cli_handler = log_cli_handler # needed for a single unittest
|
||||||
|
self.live_logs_context = catching_logs(log_cli_handler,
|
||||||
|
formatter=log_cli_formatter,
|
||||||
|
level=log_cli_level)
|
||||||
|
else:
|
||||||
|
self.log_cli_handler = None
|
||||||
|
self.live_logs_context = _dummy_context_manager()
|
||||||
|
|
|
@ -156,9 +156,9 @@ def test_log_cli_enabled_disabled(testdir, enabled):
|
||||||
''')
|
''')
|
||||||
result = testdir.runpytest('-s')
|
result = testdir.runpytest('-s')
|
||||||
if enabled:
|
if enabled:
|
||||||
assert msg in result.stderr.str()
|
assert msg in result.stdout.str()
|
||||||
else:
|
else:
|
||||||
assert msg not in result.stderr.str()
|
assert msg not in result.stdout.str()
|
||||||
|
|
||||||
|
|
||||||
def test_log_cli_default_level(testdir):
|
def test_log_cli_default_level(testdir):
|
||||||
|
@ -182,12 +182,13 @@ def test_log_cli_default_level(testdir):
|
||||||
|
|
||||||
# fnmatch_lines does an assertion internally
|
# fnmatch_lines does an assertion internally
|
||||||
result.stdout.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
'test_log_cli_default_level.py PASSED',
|
'test_log_cli_default_level.py*',
|
||||||
|
'PASSED', # 'PASSED' on its own line because the log message prints a new line
|
||||||
])
|
])
|
||||||
result.stderr.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
'*WARNING message will be shown*',
|
'*WARNING message will be shown*',
|
||||||
])
|
])
|
||||||
assert "INFO message won't be shown" not in result.stderr.str()
|
assert "INFO message won't be shown" not in result.stdout.str()
|
||||||
# make sure that that we get a '0' exit code for the testsuite
|
# make sure that that we get a '0' exit code for the testsuite
|
||||||
assert result.ret == 0
|
assert result.ret == 0
|
||||||
|
|
||||||
|
@ -213,12 +214,13 @@ def test_log_cli_level(testdir):
|
||||||
|
|
||||||
# fnmatch_lines does an assertion internally
|
# fnmatch_lines does an assertion internally
|
||||||
result.stdout.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
'test_log_cli_level.py PASSED',
|
'test_log_cli_level.py*',
|
||||||
|
'PASSED', # 'PASSED' on its own line because the log message prints a new line
|
||||||
])
|
])
|
||||||
result.stderr.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
"* This log message will be shown"
|
"* This log message will be shown"
|
||||||
])
|
])
|
||||||
for line in result.errlines:
|
for line in result.outlines:
|
||||||
try:
|
try:
|
||||||
assert "This log message won't be shown" in line
|
assert "This log message won't be shown" in line
|
||||||
pytest.fail("A log message was shown and it shouldn't have been")
|
pytest.fail("A log message was shown and it shouldn't have been")
|
||||||
|
@ -232,12 +234,13 @@ def test_log_cli_level(testdir):
|
||||||
|
|
||||||
# fnmatch_lines does an assertion internally
|
# fnmatch_lines does an assertion internally
|
||||||
result.stdout.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
'test_log_cli_level.py PASSED',
|
'test_log_cli_level.py*',
|
||||||
|
'PASSED', # 'PASSED' on its own line because the log message prints a new line
|
||||||
])
|
])
|
||||||
result.stderr.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
"* This log message will be shown"
|
"* This log message will be shown"
|
||||||
])
|
])
|
||||||
for line in result.errlines:
|
for line in result.outlines:
|
||||||
try:
|
try:
|
||||||
assert "This log message won't be shown" in line
|
assert "This log message won't be shown" in line
|
||||||
pytest.fail("A log message was shown and it shouldn't have been")
|
pytest.fail("A log message was shown and it shouldn't have been")
|
||||||
|
@ -270,12 +273,13 @@ def test_log_cli_ini_level(testdir):
|
||||||
|
|
||||||
# fnmatch_lines does an assertion internally
|
# fnmatch_lines does an assertion internally
|
||||||
result.stdout.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
'test_log_cli_ini_level.py PASSED',
|
'test_log_cli_ini_level.py*',
|
||||||
|
'PASSED', # 'PASSED' on its own line because the log message prints a new line
|
||||||
])
|
])
|
||||||
result.stderr.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
"* This log message will be shown"
|
"* This log message will be shown"
|
||||||
])
|
])
|
||||||
for line in result.errlines:
|
for line in result.outlines:
|
||||||
try:
|
try:
|
||||||
assert "This log message won't be shown" in line
|
assert "This log message won't be shown" in line
|
||||||
pytest.fail("A log message was shown and it shouldn't have been")
|
pytest.fail("A log message was shown and it shouldn't have been")
|
||||||
|
|
Loading…
Reference in New Issue