From 91ae58caff329e5437bb85482793abff1d7a7348 Mon Sep 17 00:00:00 2001 From: Damien Nozay Date: Mon, 4 Apr 2016 20:19:57 -0700 Subject: [PATCH 1/3] validate against jenkins/xunit-plugin junit-10.xsd - copyright notice left intact, - vendored file in path that points out to jenkins xunit-plugin. see also: http://stackoverflow.com/questions/4922867/junit-xml-format-specification-that-hudson-supports --- tests/testsuite.py | 23 +++ .../vendor/jenkins/xunit-plugin/junit-10.xsd | 135 ++++++++++++++++++ tox.ini | 1 + 3 files changed, 159 insertions(+) create mode 100644 tests/vendor/jenkins/xunit-plugin/junit-10.xsd diff --git a/tests/testsuite.py b/tests/testsuite.py index 02d7cc3..e7f9c13 100644 --- a/tests/testsuite.py +++ b/tests/testsuite.py @@ -15,9 +15,29 @@ from shutil import rmtree from glob import glob from xml.dom import minidom +from lxml import etree import os.path +def _load_schema(): + path = os.path.join(os.path.dirname(__file__), + 'vendor/jenkins/xunit-plugin', + 'junit-10.xsd') + with open(path, 'r') as schema_file: + schema_doc = etree.parse(schema_file) + schema = etree.XMLSchema(schema_doc) + return schema + raise RuntimeError('Could not load JUnit schema') + + +JUnitSchema = _load_schema() + + +def validate_junit_report(text): + document = etree.parse(BytesIO(text)) + JUnitSchema.assertValid(document) + + class DoctestTest(unittest.TestCase): def test_doctest_example(self): @@ -384,6 +404,8 @@ def test_junitxml_xsd_validation_order(self): i_testcase = output.index(''.encode('utf8'), output) + validate_junit_report(output) def test_xmlrunner_elapsed_times(self): self.runner_kwargs['elapsed_times'] = False diff --git a/tests/vendor/jenkins/xunit-plugin/junit-10.xsd b/tests/vendor/jenkins/xunit-plugin/junit-10.xsd new file mode 100644 index 0000000..1f41ea3 --- /dev/null +++ b/tests/vendor/jenkins/xunit-plugin/junit-10.xsd @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tox.ini b/tox.ini index 10ce42b..dc6c83d 100644 --- a/tox.ini +++ b/tox.ini @@ -13,6 +13,7 @@ deps = coveralls djangolts: django>=1.8.8,<1.9.0 djangocurr: django>=1.9.1 + lxml>=3.6.0 commands = coverage run --append setup.py test coverage report --omit='.tox/*' From 54a12fa3b08e9b6ca0ea303774a2ae670aa7bdfb Mon Sep 17 00:00:00 2001 From: Damien Nozay Date: Mon, 4 Apr 2016 20:50:32 -0700 Subject: [PATCH 2/3] trivial coverage fixup --- tests/testsuite.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/testsuite.py b/tests/testsuite.py index e7f9c13..8c074e2 100644 --- a/tests/testsuite.py +++ b/tests/testsuite.py @@ -27,7 +27,7 @@ def _load_schema(): schema_doc = etree.parse(schema_file) schema = etree.XMLSchema(schema_doc) return schema - raise RuntimeError('Could not load JUnit schema') + raise RuntimeError('Could not load JUnit schema') # pragma: no cover JUnitSchema = _load_schema() @@ -126,8 +126,6 @@ def __call__(self, result): except Exception: result.addError(self, sys.exc_info()) return - super(XMLTestRunnerTestCase.DummyErrorInCallTest, self)\ - .__call__(result) def test_pass(self): # it is expected not to be called. From fc7156cd535b3ed7608e502e9dccf2213f0c518b Mon Sep 17 00:00:00 2001 From: Damien Nozay Date: Mon, 4 Apr 2016 20:51:13 -0700 Subject: [PATCH 3/3] trivial coverage fix (py26/unittest2 cleanup) --- xmlrunner/runner.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/xmlrunner/runner.py b/xmlrunner/runner.py index fd45a2e..8ccf631 100644 --- a/xmlrunner/runner.py +++ b/xmlrunner/runner.py @@ -76,15 +76,10 @@ def run(self, test): ) self.stream.writeln() - expectedFails = unexpectedSuccesses = skipped = 0 - try: - results = map(len, (result.expectedFailures, - result.unexpectedSuccesses, - result.skipped)) - except AttributeError: - pass - else: - expectedFails, unexpectedSuccesses, skipped = results + # other metrics + expectedFails = len(result.expectedFailures) + unexpectedSuccesses = len(result.unexpectedSuccesses) + skipped = len(result.skipped) # Error traces infos = []