def test_coloredlogformatter() -> None: logfmt = "%(filename)-25s %(lineno)4d %(levelname)-8s %(message)s" record = logging.LogRecord( name="dummy", level=logging.INFO, pathname="dummypath", lineno=10, msg="Test Message", args=(), exc_info=None, ) class ColorConfig: class option: pass tw = TerminalWriter() tw.hasmarkup = True formatter = ColoredLevelFormatter(tw, logfmt) output = formatter.format(record) assert output == ( "dummypath 10 \x1b[32mINFO \x1b[0m Test Message") tw.hasmarkup = False formatter = ColoredLevelFormatter(tw, logfmt) output = formatter.format(record) assert output == ("dummypath 10 INFO Test Message")
def create_terminal_writer(config: Config, *args, **kwargs) -> TerminalWriter: """Create a TerminalWriter instance configured according to the options in the config object. Every code which requires a TerminalWriter object and has access to a config object should use this function. """ tw = TerminalWriter(*args, **kwargs) if config.option.color == "yes": tw.hasmarkup = True if config.option.color == "no": tw.hasmarkup = False return tw
def _get_error_contents_from_report(report): if report.longrepr is not None: tw = TerminalWriter(stringio=True) tw.hasmarkup = False report.toterminal(tw) exc = tw.stringio.getvalue() s = exc.strip() if s: return s return ''
def longreprtext(self) -> str: """Read-only property that returns the full string representation of ``longrepr``. .. versionadded:: 3.0 """ file = StringIO() tw = TerminalWriter(file) tw.hasmarkup = False self.toterminal(tw) exc = file.getvalue() return exc.strip()
def longreprtext(self): """ Read-only property that returns the full string representation of ``longrepr``. .. versionadded:: 3.0 """ tw = TerminalWriter(stringio=True) tw.hasmarkup = False self.toterminal(tw) exc = tw.stringio.getvalue() return exc.strip()
def create_terminal_writer( config: Config, file: Optional[TextIO] = None ) -> TerminalWriter: """Create a TerminalWriter instance configured according to the options in the config object. Every code which requires a TerminalWriter object and has access to a config object should use this function. """ tw = TerminalWriter(file=file) if config.option.color == "yes": tw.hasmarkup = True elif config.option.color == "no": tw.hasmarkup = False if config.option.code_highlight == "yes": tw.code_highlight = True elif config.option.code_highlight == "no": tw.code_highlight = False return tw
def _get_error_contents_from_report(report): if report.longrepr is not None: try: tw = TerminalWriter(stringio=True) stringio = tw.stringio except TypeError: import io stringio = io.StringIO() tw = TerminalWriter(file=stringio) tw.hasmarkup = False report.toterminal(tw) exc = stringio.getvalue() s = exc.strip() if s: return s return ''
def test_exc_chain_repr_without_traceback(self, importasmod, reason, description): """ Handle representation of exception chains where one of the exceptions doesn't have a real traceback, such as those raised in a subprocess submitted by the multiprocessing module (#1984). """ exc_handling_code = " from e" if reason == "cause" else "" mod = importasmod( """ def f(): try: g() except Exception as e: raise RuntimeError('runtime problem'){exc_handling_code} def g(): raise ValueError('invalid value') """.format( exc_handling_code=exc_handling_code ) ) with pytest.raises(RuntimeError) as excinfo: mod.f() # emulate the issue described in #1984 attr = "__%s__" % reason getattr(excinfo.value, attr).__traceback__ = None r = excinfo.getrepr() file = io.StringIO() tw = TerminalWriter(file=file) tw.hasmarkup = False r.toterminal(tw) matcher = LineMatcher(file.getvalue().splitlines()) matcher.fnmatch_lines( [ "ValueError: invalid value", description, "* except Exception as e:", "> * raise RuntimeError('runtime problem')" + exc_handling_code, "E *RuntimeError: runtime problem", ] )
def test_colored_short_level() -> None: logfmt = "%(levelname).1s %(message)s" record = logging.LogRecord( name="dummy", level=logging.INFO, pathname="dummypath", lineno=10, msg="Test Message", args=(), exc_info=None, ) class ColorConfig: class option: pass tw = TerminalWriter() tw.hasmarkup = True formatter = ColoredLevelFormatter(tw, logfmt) output = formatter.format(record) # the I (of INFO) is colored assert output == ("\x1b[32mI\x1b[0m Test Message")
def dump_json(self, reports): # Compute the final test outcome outcomes = [report.outcome for report in reports] if "failed" in outcomes: outcome = "failed" elif "skipped" in outcomes: outcome = "skipped" else: outcome = "passed" # Errors error = "" errors = {} for report in reports: if report.outcome == "failed" and report.longrepr: if hasattr(report.longrepr, "toterminal"): # Compute human repre tw = TerminalWriter(stringio=True) tw.hasmarkup = False report.longrepr.toterminal(tw) exc = tw.stringio.getvalue() else: exc = str(report.longrepr) humanrepr = exc.strip() errors[report.when] = {"humanrepr": humanrepr} # Take the first error if not error: error = humanrepr # Skipped skipped_messages = {} for report in reports: if report.outcome == "skipped" and report.longrepr: skipped_messages[report.when] = report.longrepr[2] # Durations total_duration = 0 durations = {} for report in reports: durations[report.when] = report.duration total_duration += report.duration report = reports[-1] # Get logs reports logs = "" for secname, content in report.sections: if secname == "Captured log call": logs = content raw_json_report = { "_type": "test_result", "file": report.fspath, "line": report.location[1] + 1, # Pytest lineno are 0-based "test_name": report.location[2], "duration": total_duration, "durations": durations, "outcome": outcome, "id": report.nodeid, "stdout": report.capstdout, "stderr": report.capstderr, "error": { "humanrepr": error }, "logs": logs, "skipped_messages": skipped_messages, } output(raw_json_report)