2016-08-11 10:47:12 +00:00
|
|
|
import unittest
|
|
|
|
|
|
|
|
from django.test import SimpleTestCase
|
|
|
|
from django.test.runner import RemoteTestResult
|
2017-11-17 21:12:48 +00:00
|
|
|
from django.utils.version import PY37
|
2016-08-11 10:47:12 +00:00
|
|
|
|
|
|
|
try:
|
|
|
|
import tblib
|
|
|
|
except ImportError:
|
|
|
|
tblib = None
|
|
|
|
|
|
|
|
|
2016-10-06 19:54:38 +00:00
|
|
|
class ExceptionThatFailsUnpickling(Exception):
|
|
|
|
"""
|
|
|
|
After pickling, this class fails unpickling with an error about incorrect
|
|
|
|
arguments passed to __init__().
|
|
|
|
"""
|
|
|
|
def __init__(self, arg):
|
2017-01-21 13:13:44 +00:00
|
|
|
super().__init__()
|
2016-10-06 19:54:38 +00:00
|
|
|
|
|
|
|
|
2016-08-11 10:47:12 +00:00
|
|
|
class ParallelTestRunnerTest(SimpleTestCase):
|
|
|
|
"""
|
|
|
|
End-to-end tests of the parallel test runner.
|
|
|
|
|
|
|
|
These tests are only meaningful when running tests in parallel using
|
|
|
|
the --parallel option, though it doesn't hurt to run them not in
|
|
|
|
parallel.
|
|
|
|
"""
|
|
|
|
|
|
|
|
def test_subtest(self):
|
|
|
|
"""
|
2016-10-27 07:53:39 +00:00
|
|
|
Passing subtests work.
|
2016-08-11 10:47:12 +00:00
|
|
|
"""
|
|
|
|
for i in range(2):
|
|
|
|
with self.subTest(index=i):
|
|
|
|
self.assertEqual(i, i)
|
|
|
|
|
|
|
|
|
|
|
|
class SampleFailingSubtest(SimpleTestCase):
|
|
|
|
|
|
|
|
# This method name doesn't begin with "test" to prevent test discovery
|
|
|
|
# from seeing it.
|
|
|
|
def dummy_test(self):
|
|
|
|
"""
|
|
|
|
A dummy test for testing subTest failures.
|
|
|
|
"""
|
|
|
|
for i in range(3):
|
|
|
|
with self.subTest(index=i):
|
|
|
|
self.assertEqual(i, 1)
|
|
|
|
|
|
|
|
|
|
|
|
class RemoteTestResultTest(SimpleTestCase):
|
|
|
|
|
2016-10-06 19:54:38 +00:00
|
|
|
def test_pickle_errors_detection(self):
|
|
|
|
picklable_error = RuntimeError('This is fine')
|
|
|
|
not_unpicklable_error = ExceptionThatFailsUnpickling('arg')
|
|
|
|
|
|
|
|
result = RemoteTestResult()
|
|
|
|
result._confirm_picklable(picklable_error)
|
|
|
|
|
|
|
|
msg = '__init__() missing 1 required positional argument'
|
|
|
|
with self.assertRaisesMessage(TypeError, msg):
|
|
|
|
result._confirm_picklable(not_unpicklable_error)
|
|
|
|
|
2016-12-01 10:38:01 +00:00
|
|
|
@unittest.skipUnless(tblib is not None, 'requires tblib to be installed')
|
2016-08-11 10:47:12 +00:00
|
|
|
def test_add_failing_subtests(self):
|
|
|
|
"""
|
|
|
|
Failing subtests are added correctly using addSubTest().
|
|
|
|
"""
|
|
|
|
# Manually run a test with failing subtests to prevent the failures
|
|
|
|
# from affecting the actual test run.
|
|
|
|
result = RemoteTestResult()
|
|
|
|
subtest_test = SampleFailingSubtest(methodName='dummy_test')
|
|
|
|
subtest_test.run(result=result)
|
|
|
|
|
|
|
|
events = result.events
|
|
|
|
self.assertEqual(len(events), 4)
|
|
|
|
|
|
|
|
event = events[1]
|
|
|
|
self.assertEqual(event[0], 'addSubTest')
|
|
|
|
self.assertEqual(str(event[2]), 'dummy_test (test_runner.test_parallel.SampleFailingSubtest) (index=0)')
|
2017-11-17 21:12:48 +00:00
|
|
|
trailing_comma = '' if PY37 else ','
|
|
|
|
self.assertEqual(repr(event[3][1]), "AssertionError('0 != 1'%s)" % trailing_comma)
|
2016-08-11 10:47:12 +00:00
|
|
|
|
|
|
|
event = events[2]
|
2017-11-17 21:12:48 +00:00
|
|
|
self.assertEqual(repr(event[3][1]), "AssertionError('2 != 1'%s)" % trailing_comma)
|