Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions tests/django_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import os
from os import path
import glob
import mock
import tempfile
import shutil

Expand Down Expand Up @@ -129,3 +130,20 @@ def test_django_multiple_reports(self):
self.assertTrue(test_files,
'did not generate xml reports where expected.')
self.assertEqual(2, len(test_files))

def test_django_runner_extension(self):
from xmlrunner.extra.djangotestrunner import XMLTestRunner

class MyDjangoRunner(XMLTestRunner):
test_runner = mock.Mock()

self._override_settings(
TEST_OUTPUT_DIR=self.tmpdir,
TEST_OUTPUT_VERBOSE=0)
apps.populate(settings.INSTALLED_APPS)

runner = MyDjangoRunner()
suite = runner.build_suite(test_labels=None)
runner.run_suite(suite)

self.assertTrue(MyDjangoRunner.test_runner.called)
1 change: 1 addition & 0 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ deps =
djangolts: django>=1.8.8,<1.9.0
djangocurr: django>=1.9.1
lxml>=3.6.0
mock
commands =
coverage run --append setup.py test
coverage report --omit='.tox/*'
Expand Down
46 changes: 32 additions & 14 deletions xmlrunner/extra/djangotestrunner.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,27 +17,45 @@


class XMLTestRunner(DiscoverRunner):
test_runner = xmlrunner.XMLTestRunner

def run_suite(self, suite, **kwargs):
dummy = kwargs # unused
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was a useful (somewhat) comment.

def get_resultclass(self):
# Django provides `DebugSQLTextTestResult` if `debug_sql` argument is True
# To use `xmlrunner.result._XMLTestResult` we supress default behavior
return None

def get_test_runner_kwargs(self):
# We use separate verbosity setting for our runner
verbosity = getattr(settings, 'TEST_OUTPUT_VERBOSE', 1)
# XXX: verbosity = self.verbosity
if isinstance(verbosity, bool):
verbosity = (1, 2)[verbosity]
descriptions = getattr(settings, 'TEST_OUTPUT_DESCRIPTIONS', False)
verbosity = verbosity # not self.verbosity

output_dir = getattr(settings, 'TEST_OUTPUT_DIR', '.')
single_file = getattr(settings, 'TEST_OUTPUT_FILE_NAME', None)

kwargs = dict(
verbosity=verbosity, descriptions=descriptions,
failfast=self.failfast)
if single_file is not None:
# For single file case we are able to create file here
# But for multiple files case files will be created inside runner/results
if single_file is None: # output will be a path (folder)
output = output_dir
else: # output will be a stream
if not os.path.exists(output_dir):
os.makedirs(output_dir)
file_path = os.path.join(output_dir, single_file)
with open(file_path, 'wb') as xml:
return xmlrunner.XMLTestRunner(
output=xml, **kwargs).run(suite)
else:
return xmlrunner.XMLTestRunner(
output=output_dir, **kwargs).run(suite)
output = open(file_path, 'wb')

return dict(
verbosity=verbosity,
descriptions=getattr(settings, 'TEST_OUTPUT_DESCRIPTIONS', False),
failfast=self.failfast,
resultclass=self.get_resultclass(),
output=output,
)

def run_suite(self, suite, **kwargs):
runner_kwargs = self.get_test_runner_kwargs()
runner = self.test_runner(**runner_kwargs)
results = runner.run(suite)
if hasattr(runner_kwargs['output'], 'close'):
runner_kwargs['output'].close()
return results