diff --git a/tests/testsuite.py b/tests/testsuite.py index 02d7cc3..8c074e2 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') # pragma: no cover + + +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): @@ -106,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. @@ -384,6 +402,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/*' 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 = []