From 15da886f5d5daeced047f0dc8bb20450e73cae11 Mon Sep 17 00:00:00 2001 From: Dan Villiom Podlaski Christiansen Date: Tue, 13 Nov 2018 18:44:28 +0100 Subject: [PATCH] runner: reinstate all unittest arguments; add --output I tested with Python 2.7, 3.5 and 3.7, and at least --buffer works everywhere. I was also missing a way to specify the output directory, so I added the ability to do so. This fixes #143 and closes #144. --- tests/testsuite.py | 29 +++++++++++++++++++++++++++++ xmlrunner/__main__.py | 10 ++-------- xmlrunner/runner.py | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/tests/testsuite.py b/tests/testsuite.py index 1cacf05..4424db3 100755 --- a/tests/testsuite.py +++ b/tests/testsuite.py @@ -23,6 +23,11 @@ import os import os.path +try: + from unittest import mock +except ImportError: + import mock + def _load_schema(): path = os.path.join(os.path.dirname(__file__), @@ -699,3 +704,27 @@ def test_write(self): self.writer.flush() self.assertEqual(self.getFirstContent(), self.getSecondContent()) self.assertEqual(wrote, len(self.getSecondContent())) + + +@unittest.skipIf(sys.version_info[0] < 3, 'Python 3 required') +class XMLProgramTestCase(unittest.TestCase): + @mock.patch('sys.argv', ['xmlrunner', '-o', 'flaf']) + @mock.patch('xmlrunner.runner.XMLTestRunner') + @mock.patch('sys.exit') + def test_xmlrunner_output(self, exiter, testrunner): + xmlrunner.runner.XMLTestProgram() + + kwargs = dict( + buffer=False, + failfast=False, + verbosity=1, + warnings='default', + output='flaf', + ) + + if sys.version_info[:2] > (3, 4): + kwargs.update(tb_locals=False) + + testrunner.assert_called_once_with(**kwargs) + + exiter.assert_called_once_with(False) diff --git a/xmlrunner/__main__.py b/xmlrunner/__main__.py index a2068ab..1f90374 100644 --- a/xmlrunner/__main__.py +++ b/xmlrunner/__main__.py @@ -1,8 +1,7 @@ """Main entry point""" import sys -from .unittest import TestProgram -from .runner import XMLTestRunner +from .runner import XMLTestProgram if sys.argv[0].endswith("__main__.py"): import os.path @@ -17,9 +16,4 @@ __unittest = True -main = TestProgram - -main( - module=None, testRunner=XMLTestRunner, - # see issue #59 - failfast=False, catchbreak=False, buffer=False) +XMLTestProgram(module=None) diff --git a/xmlrunner/runner.py b/xmlrunner/runner.py index c0310b1..e9ae92e 100644 --- a/xmlrunner/runner.py +++ b/xmlrunner/runner.py @@ -2,7 +2,7 @@ import sys import time -from .unittest import TextTestRunner +from .unittest import TextTestRunner, TestProgram from .result import _XMLTestResult # see issue #74, the encoding name needs to be one of @@ -113,3 +113,34 @@ def run(self, test): pass return result + + +class XMLTestProgram(TestProgram): + output = None + + def __init__(self, *args, **kwargs): + kwargs.setdefault('testRunner', XMLTestRunner) + super(XMLTestProgram, self).__init__(*args, **kwargs) + + def _initArgParsers(self): + super(XMLTestProgram, self)._initArgParsers() + + for parser in (self._main_parser, self._discovery_parser): + parser.add_argument('-o', '--output', metavar='DIR', + help='Directory for storing XML reports ' + "('.' default)") + + def runTests(self): + if self.output is not None: + kwargs = dict(verbosity=self.verbosity, + failfast=self.failfast, + buffer=self.buffer, + warnings=self.warnings, + output=self.output) + + if sys.version_info[:2] > (3, 4): + kwargs.update(tb_locals=self.tb_locals) + + self.testRunner = self.testRunner(**kwargs) + + super(XMLTestProgram, self).runTests()