From b66dc800081bff90b82b6e3649da5838c7531089 Mon Sep 17 00:00:00 2001 From: Claudio Madotto Date: Sun, 24 Nov 2019 15:20:02 +0100 Subject: [PATCH] Fix for issue #5430 - junit-xml: logs are not passed to junit report for tests failed not in a teardown phase --- src/_pytest/junitxml.py | 1 + testing/test_junitxml.py | 42 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/_pytest/junitxml.py b/src/_pytest/junitxml.py index 9cf22705e..21b54ef86 100644 --- a/src/_pytest/junitxml.py +++ b/src/_pytest/junitxml.py @@ -591,6 +591,7 @@ class LogXML: if report.when == "call": reporter.append_failure(report) self.open_reports.append(report) + reporter.write_captured_output(report) else: reporter.append_error(report) elif report.skipped: diff --git a/testing/test_junitxml.py b/testing/test_junitxml.py index 4c2f22a3d..0132db59d 100644 --- a/testing/test_junitxml.py +++ b/testing/test_junitxml.py @@ -1477,3 +1477,45 @@ def test_logging_passing_tests_disabled_does_not_log_test_output( node = dom.find_first_by_tag("testcase") assert len(node.find_by_tag("system-err")) == 0 assert len(node.find_by_tag("system-out")) == 0 + + +@parametrize_families +@pytest.mark.parametrize("junit_logging", ["no", "system-out", "system-err"]) +def test_logging_passing_tests_disabled_logs_output_for_failing_test_issue5430( + testdir, junit_logging, run_and_parse, xunit_family +): + testdir.makeini( + """ + [pytest] + junit_log_passing_tests=False + junit_family={family} + """.format( + family=xunit_family + ) + ) + testdir.makepyfile( + """ + import pytest + import logging + import sys + + def test_func(): + logging.warning('hello') + assert 0 + """ + ) + result, dom = run_and_parse( + "-o", "junit_logging=%s" % junit_logging, family=xunit_family + ) + assert result.ret == 1 + node = dom.find_first_by_tag("testcase") + if junit_logging == "system-out": + assert len(node.find_by_tag("system-err")) == 0 + assert len(node.find_by_tag("system-out")) == 1 + elif junit_logging == "system-err": + assert len(node.find_by_tag("system-err")) == 1 + assert len(node.find_by_tag("system-out")) == 0 + else: + assert junit_logging == "no" + assert len(node.find_by_tag("system-err")) == 0 + assert len(node.find_by_tag("system-out")) == 0