3 new commits in pytest: https://bitbucket.org/hpk42/pytest/commits/5d9007722ea1/ Changeset: 5d9007722ea1 User: hpk42 Date: 2013-04-16 09:04:05 Summary: slightly improve -k help string cosmetic change to test_nose.py Affected #: 2 files
diff -r 82139da07b58da52fc124be4218c8957b71f3ac1 -r 5d9007722ea163f43d4115f76a72cfd527111cbd _pytest/mark.py --- a/_pytest/mark.py +++ b/_pytest/mark.py @@ -7,8 +7,8 @@ def pytest_addoption(parser): group = parser.getgroup("general") group._addoption('-k', - action="store", dest="keyword", default='', metavar="KEYWORDEXPR", - help="only run tests which match the given expression. " + action="store", dest="keyword", default='', metavar="EXPRESSION", + help="only run tests which match the given substring expression. " "An expression is a python evaluatable expression " "where all names are substring-matched against test names " "and keywords. Example: -k 'test_method or test_other' " diff -r 82139da07b58da52fc124be4218c8957b71f3ac1 -r 5d9007722ea163f43d4115f76a72cfd527111cbd testing/test_nose.py --- a/testing/test_nose.py +++ b/testing/test_nose.py @@ -304,8 +304,9 @@ result = testdir.runpytest() result.stdout.fnmatch_lines("*1 passed*") +@pytest.mark.skipif("sys.version_info < (2,6)") def test_setup_teardown_linking_issue265(testdir): - # we accidnetially didnt integrate nose setupstate with normal setupstate + # we accidentally didnt integrate nose setupstate with normal setupstate # this test ensures that won't happen again testdir.makepyfile(''' import pytest @@ -314,7 +315,8 @@ def test_nothing(self): """Tests the API of the implementation (for generic and specialized).""" - @pytest.mark.skipif("True", reason="Skip tests to check if teardown is skipped as well.") + @pytest.mark.skipif("True", reason= + "Skip tests to check if teardown is skipped as well.") class TestSkipTeardown(TestGeneric): def setup(self): https://bitbucket.org/hpk42/pytest/commits/af95db883582/ Changeset: af95db883582 User: hpk42 Date: 2013-04-16 09:13:58 Summary: merge Affected #: 4 files diff -r 5d9007722ea163f43d4115f76a72cfd527111cbd -r af95db883582c12caf5e6b65b7b2fed022fe6e70 _pytest/capture.py --- a/_pytest/capture.py +++ b/_pytest/capture.py @@ -173,8 +173,7 @@ if funcarg_outerr is not None: outerr = (outerr[0] + funcarg_outerr[0], outerr[1] + funcarg_outerr[1]) - if not rep.passed: - addouterr(rep, outerr) + addouterr(rep, outerr) if not rep.passed or rep.when == "teardown": outerr = ('', '') item.outerr = outerr diff -r 5d9007722ea163f43d4115f76a72cfd527111cbd -r af95db883582c12caf5e6b65b7b2fed022fe6e70 _pytest/junitxml.py --- a/_pytest/junitxml.py +++ b/_pytest/junitxml.py @@ -107,11 +107,20 @@ time=getattr(report, 'duration', 0) )) + def _write_captured_output(self, report): + sec = dict(report.sections) + for name in ('out', 'err'): + content = sec.get("Captured std%s" % name) + if content: + tag = getattr(Junit, 'system-'+name) + self.append(tag(bin_xml_escape(content))) + def append(self, obj): self.tests[-1].append(obj) def append_pass(self, report): self.passed += 1 + self._write_captured_output(report) def append_failure(self, report): #msg = str(report.longrepr.reprtraceback.extraline) @@ -120,16 +129,11 @@ Junit.skipped(message="xfail-marked test passes unexpectedly")) self.skipped += 1 else: - sec = dict(report.sections) fail = Junit.failure(message="test failure") fail.append(str(report.longrepr)) self.append(fail) - for name in ('out', 'err'): - content = sec.get("Captured std%s" % name) - if content: - tag = getattr(Junit, 'system-'+name) - self.append(tag(bin_xml_escape(content))) self.failed += 1 + self._write_captured_output(report) def append_collect_failure(self, report): #msg = str(report.longrepr.reprtraceback.extraline) @@ -162,6 +166,7 @@ message=skipreason )) self.skipped += 1 + self._write_captured_output(report) def pytest_runtest_logreport(self, report): if report.passed: diff -r 5d9007722ea163f43d4115f76a72cfd527111cbd -r af95db883582c12caf5e6b65b7b2fed022fe6e70 _pytest/pdb.py --- a/_pytest/pdb.py +++ b/_pytest/pdb.py @@ -70,16 +70,21 @@ tw.sep(">", "traceback") rep.toterminal(tw) tw.sep(">", "entering PDB") - # A doctest.UnexpectedException is not useful for post_mortem. - # Use the underlying exception instead: - if isinstance(call.excinfo.value, py.std.doctest.UnexpectedException): - tb = call.excinfo.value.exc_info[2] - else: - tb = call.excinfo._excinfo[2] + + tb = self._postmortem_traceback(call.excinfo) post_mortem(tb) rep._pdbshown = True return rep + @staticmethod + def _postmortem_traceback(excinfo): + # A doctest.UnexpectedException is not useful for post_mortem. + # Use the underlying exception instead: + if isinstance(excinfo.value, py.std.doctest.UnexpectedException): + return excinfo.value.exc_info[2] + else: + return excinfo._excinfo[2] + def post_mortem(t): pdb = py.std.pdb class Pdb(pdb.Pdb): diff -r 5d9007722ea163f43d4115f76a72cfd527111cbd -r af95db883582c12caf5e6b65b7b2fed022fe6e70 testing/test_junitxml.py --- a/testing/test_junitxml.py +++ b/testing/test_junitxml.py @@ -282,13 +282,35 @@ if not sys.platform.startswith("java"): assert "hx" in fnode.toxml() + def test_pass_captures_stdout(self, testdir): + testdir.makepyfile(""" + def test_pass(): + print('hello-stdout') + """) + result, dom = runandparse(testdir) + node = dom.getElementsByTagName("testsuite")[0] + pnode = node.getElementsByTagName("testcase")[0] + systemout = pnode.getElementsByTagName("system-out")[0] + assert "hello-stdout" in systemout.toxml() + + def test_pass_captures_stderr(self, testdir): + testdir.makepyfile(""" + import sys + def test_pass(): + sys.stderr.write('hello-stderr') + """) + result, dom = runandparse(testdir) + node = dom.getElementsByTagName("testsuite")[0] + pnode = node.getElementsByTagName("testcase")[0] + systemout = pnode.getElementsByTagName("system-err")[0] + assert "hello-stderr" in systemout.toxml() + def test_mangle_testnames(): from _pytest.junitxml import mangle_testnames names = ["a/pything.py", "Class", "()", "method"] newnames = mangle_testnames(names) assert newnames == ["a.pything", "Class", "method"] - def test_dont_configure_on_slaves(tmpdir): gotten = [] class FakeConfig: https://bitbucket.org/hpk42/pytest/commits/e648b0ab9f00/ Changeset: e648b0ab9f00 User: hpk42 Date: 2013-04-16 09:14:47 Summary: add to changelog: put captured stdout/stderr into junitxml output even for passing tests (thanks Adam Goucher) Affected #: 1 file diff -r af95db883582c12caf5e6b65b7b2fed022fe6e70 -r e648b0ab9f006799cce2e4ed229eec9d3a26a9c0 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,9 @@ Changes between 2.3.4 and 2.3.5dev ----------------------------------- +- put captured stdout/stderr into junitxml output even for passing tests + (thanks Adam Goucher) + - Issue 265 - integrate nose setup/teardown with setupstate so it doesnt try to teardown if it did not setup Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. _______________________________________________ pytest-commit mailing list pytest-commit@python.org http://mail.python.org/mailman/listinfo/pytest-commit