Skip to content

Commit 6eaa5e6

Browse files
committed
Merge pull request #125 from xmlrunner/django-runner
Add more tests for the django test runner.
2 parents e7a8a5a + ab20b0d commit 6eaa5e6

File tree

7 files changed

+127
-14
lines changed

7 files changed

+127
-14
lines changed

tests/django_example/example/__init__.py

Whitespace-only changes.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
import os
3+
4+
5+
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
6+
SECRET_KEY = 'not-a-secret'
7+
DEBUG = True
8+
ALLOWED_HOSTS = []
9+
INSTALLED_APPS = ['app', 'app2']
10+
MIDDLEWARE_CLASSES = []
11+
ROOT_URLCONF = 'example.urls'
12+
TEMPLATES = []
13+
DATABASES = {
14+
'default': {
15+
'ENGINE': 'django.db.backends.sqlite3',
16+
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
17+
}
18+
}
19+
LANGUAGE_CODE = 'en-us'
20+
TIME_ZONE = 'UTC'
21+
USE_I18N = True
22+
USE_L10N = True
23+
USE_TZ = True
24+
STATIC_URL = '/static/'
25+
26+
# The settings we care about for xmlrunner.
27+
# They are commented out because we will use settings.configure() in tests.
28+
29+
# TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner'
30+
# TEST_OUTPUT_FILE_NAME = 'results.xml'
31+
# TEST_OUTPUT_VERBOSE = 2
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
from django.conf.urls import url
3+
from django.contrib import admin
4+
5+
6+
urlpatterns = [
7+
url(r'^admin/', admin.site.urls),
8+
]
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
import os
3+
from django.core.wsgi import get_wsgi_application
4+
5+
6+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings")
7+
application = get_wsgi_application()

tests/django_example/manage.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env python
2+
import os
3+
import sys
4+
5+
6+
if __name__ == "__main__":
7+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings")
8+
from django.core.management import execute_from_command_line
9+
execute_from_command_line(sys.argv)

tests/django_test.py

Lines changed: 58 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
from xmlrunner.unittest import unittest
22

33
import sys
4-
from os import path, chdir, getcwd
4+
import os
5+
from os import path
6+
import glob
7+
import tempfile
8+
import shutil
59

610
try:
711
import django
812
except ImportError:
913
django = None
1014
else:
1115
from django.test.utils import get_runner
16+
from django.conf import settings, UserSettingsHolder
17+
from django.apps import apps
18+
1219

1320
TESTS_DIR = path.dirname(__file__)
1421

@@ -17,15 +24,30 @@
1724
class DjangoTest(unittest.TestCase):
1825

1926
def setUp(self):
20-
self._old_cwd = getcwd()
27+
self._old_cwd = os.getcwd()
2128
self.project_dir = path.abspath(path.join(TESTS_DIR, 'django_example'))
22-
chdir(self.project_dir)
29+
self.tmpdir = tempfile.mkdtemp()
30+
os.chdir(self.project_dir)
2331
sys.path.append(self.project_dir)
24-
import django.conf
25-
django.conf.settings = django.conf.LazySettings()
32+
# allow changing settings
33+
self.old_settings = settings._wrapped
34+
os.environ['DJANGO_SETTINGS_MODULE'] = 'example.settings'
35+
settings.INSTALLED_APPS # load settings on first access
36+
settings.DATABASES['default']['NAME'] = path.join(
37+
self.tmpdir, 'db.sqlilte3')
38+
# this goes around the "settings already loaded" issue.
39+
self.override = UserSettingsHolder(settings._wrapped)
40+
settings._wrapped = self.override
2641

2742
def tearDown(self):
28-
chdir(self._old_cwd)
43+
os.chdir(self._old_cwd)
44+
shutil.rmtree(self.tmpdir)
45+
settings._wrapped = self.old_settings
46+
47+
def _override_settings(self, **kwargs):
48+
# see django.test.utils.override_settings
49+
for key, new_value in kwargs.items():
50+
setattr(self.override, key, new_value)
2951

3052
def _check_runner(self, runner):
3153
suite = runner.build_suite(test_labels=['app2', 'app'])
@@ -42,17 +64,42 @@ def _check_runner(self, runner):
4264
]))
4365

4466
def test_django_runner(self):
45-
from django.conf import settings
46-
settings.configure(INSTALLED_APPS=['app', 'app2'])
4767
runner_class = get_runner(settings)
4868
runner = runner_class()
4969
self._check_runner(runner)
5070

5171
def test_django_xmlrunner(self):
52-
from django.conf import settings
53-
settings.configure(
54-
INSTALLED_APPS=['app', 'app2'],
72+
self._override_settings(
5573
TEST_RUNNER='xmlrunner.extra.djangotestrunner.XMLTestRunner')
5674
runner_class = get_runner(settings)
5775
runner = runner_class()
5876
self._check_runner(runner)
77+
78+
def test_django_single_report(self):
79+
self._override_settings(
80+
TEST_OUTPUT_DIR=self.tmpdir,
81+
TEST_OUTPUT_FILE_NAME='results.xml',
82+
TEST_OUTPUT_VERBOSE=0,
83+
TEST_RUNNER='xmlrunner.extra.djangotestrunner.XMLTestRunner')
84+
apps.populate(settings.INSTALLED_APPS)
85+
runner_class = get_runner(settings)
86+
runner = runner_class()
87+
suite = runner.build_suite()
88+
runner.run_suite(suite)
89+
expected_file = path.join(self.tmpdir, 'results.xml')
90+
self.assertTrue(path.exists(expected_file),
91+
'did not generate xml report where expected.')
92+
93+
def test_django_multiple_reports(self):
94+
self._override_settings(
95+
TEST_OUTPUT_DIR=self.tmpdir,
96+
TEST_OUTPUT_VERBOSE=0,
97+
TEST_RUNNER='xmlrunner.extra.djangotestrunner.XMLTestRunner')
98+
apps.populate(settings.INSTALLED_APPS)
99+
runner_class = get_runner(settings)
100+
runner = runner_class()
101+
suite = runner.build_suite(test_labels=None)
102+
runner.run_suite(suite)
103+
test_files = glob.glob(path.join(self.tmpdir, 'TEST*.xml'))
104+
self.assertTrue(test_files,
105+
'did not generate xml reports where expected.')

xmlrunner/extra/djangotestrunner.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"""
1111

1212
import xmlrunner
13+
import os.path
1314
from django.conf import settings
1415
from django.test.runner import DiscoverRunner
1516

@@ -23,7 +24,17 @@ def run_suite(self, suite, **kwargs):
2324
if isinstance(verbosity, bool):
2425
verbosity = (1, 2)[verbosity]
2526
descriptions = getattr(settings, 'TEST_OUTPUT_DESCRIPTIONS', False)
26-
output = getattr(settings, 'TEST_OUTPUT_DIR', '.')
27-
return xmlrunner.XMLTestRunner(
27+
output_dir = getattr(settings, 'TEST_OUTPUT_DIR', '.')
28+
single_file = getattr(settings, 'TEST_OUTPUT_FILE_NAME', None)
29+
30+
kwargs = dict(
2831
verbosity=verbosity, descriptions=descriptions,
29-
output=output, failfast=self.failfast).run(suite)
32+
failfast=self.failfast)
33+
if single_file is not None:
34+
file_path = os.path.join(output_dir, single_file)
35+
with open(file_path, 'wb') as xml:
36+
return xmlrunner.XMLTestRunner(
37+
output=xml, **kwargs).run(suite)
38+
else:
39+
return xmlrunner.XMLTestRunner(
40+
output=output_dir, **kwargs).run(suite)

0 commit comments

Comments
 (0)