#36491: AttributeError: '_io.TextIOWrapper' object has no attribute 'getvalue'
when
setUpTestData raises and tests are run with –parallel –buffer
-------------------------------------+-------------------------------------
Reporter: Rafael Carlos | Owner: (none)
Soriano Marmol |
Type: Bug | Status: new
Component: Testing framework | Version: 5.2
Severity: Normal | Resolution:
Keywords: tests, parallel, | Triage Stage:
buffer | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by Rafael Carlos Soriano Marmol:
Old description:
> Similar issue reported here: https://code.djangoproject.com/ticket/35794
>
> If a test class raises an exception in setUpTestData(), the failure is
> reported correctly when tests are executed
> • in sequence, or
> • in parallel without buffering (--parallel only).
>
> However, running the same suite with both **--parallel and --buffer**
> causes the test run to abort with an unrelated AttributeError, and the
> original exception is lost.
>
> Minimal reproducer
>
> {{{
>
> # tests/test_issue.py
> from django.test import TestCase
>
> class AbortingTest(TestCase):
> @classmethod
> def setUpTestData(cls):
> raise RuntimeError("Boo!")
>
> def test_pass(self):
> pass
>
> class AnotherAbortingTest(TestCase):
> @classmethod
> def setUpTestData(cls):
> raise RuntimeError("Boo Too!")
>
> def test_pass(self):
> pass
> }}}
>
> the errors are reported clearly when running tests in sequence or
> --parallel **without --buffer**
>
> {{{
> ======================================================================
> ERROR: setUpClass
> (investment.investment.tests.test_issue.AnotherAbortingTest)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File
> "/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/suite.py",
> line 166, in _handleClassSetUp
> setUpClass()
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/test/testcases.py", line 1426, in setUpClass
> cls.setUpTestData()
> ^^^^^^^^^^^^^^^^^
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/Indiana/investment/investment/tests/test_issue.py", line
> 16, in setUpTestData
> raise RuntimeError("Boo Too!")
> ^^^^^^^^^^^^^^^^^
> RuntimeError: Boo Too!
>
> ======================================================================
> ERROR: setUpClass (investment.investment.tests.test_issue.AbortingTest)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
> File
> "/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/suite.py",
> line 166, in _handleClassSetUp
> setUpClass()
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/test/testcases.py", line 1426, in setUpClass
> cls.setUpTestData()
> ^^^^^^^^^^^^^^^^^
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/Indiana/investment/investment/tests/test_issue.py", line
> 7, in setUpTestData
> raise RuntimeError("Boo!")
> ^^^^^^^^^^^^^^^^^
> RuntimeError: Boo!
>
> ----------------------------------------------------------------------
> Ran 0 tests in 4.715s
>
> FAILED (errors=2)
> }}}
>
> ❌ Fails (parallel **with** buffer)
>
> python manage.py test tests.test_issue --parallel --buffer
>
> {{{
> Destroying test database for alias 'default'...
> Traceback (most recent call last):
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/Indiana/manage.py", line 34, in <module>
> main()
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/Indiana/manage.py", line 29, in main
> execute_from_command_line(sys.argv)
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/core/management/__init__.py", line 442, in
> execute_from_command_line
> utility.execute()
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/core/management/__init__.py", line 436, in execute
> self.fetch_command(subcommand).run_from_argv(self.argv)
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/core/management/commands/test.py", line 24, in
> run_from_argv
> super().run_from_argv(argv)
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/core/management/base.py", line 416, in run_from_argv
> self.execute(*args, **cmd_options)
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/core/management/base.py", line 460, in execute
> output = self.handle(*args, **options)
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/core/management/commands/test.py", line 63, in handle
> failures = test_runner.run_tests(test_labels)
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/test/runner.py", line 1099, in run_tests
> result = self.run_suite(suite)
> ^^^^^^^^^^^^^^^^^^^^^
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/test/runner.py", line 1026, in run_suite
> return runner.run(suite)
> ^^^^^^^^^^^^^^^^^
> File
> "/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/runner.py",
> line 240, in run
> test(result)
> File
> "/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/suite.py",
> line 84, in __call__
> return self.run(*args, **kwds)
> ^^^^^^^^^^^^^^^^^^^^^^^
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/test/runner.py", line 562, in run
> self.handle_event(result, tests, event)
> File "/Users/[email protected]/dell/home/rsoriano/repositorios
> /docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
> packages/django/test/runner.py", line 586, in handle_event
> handler(test, *args)
> File
> "/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/runner.py",
> line 101, in addError
> super(TextTestResult, self).addError(test, err)
> File
> "/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/result.py",
> line 17, in inner
> return method(self, *args, **kw)
> ^^^^^^^^^^^^^^^^^^^^^^^^^
> File
> "/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/result.py",
> line 116, in addError
> self.errors.append((test, self._exc_info_to_string(err, test)))
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File
> "/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/result.py",
> line 195, in _exc_info_to_string
> output = sys.stdout.getvalue()
> ^^^^^^^^^^^^^^^^^^^
> AttributeError: '_io.TextIOWrapper' object has no attribute 'getvalue'
> }}}
>
> * The traceback contains no reference to the original
> RuntimeError("Boo!") / RuntimeError("Boo Too!").
>
> **Expected behaviour**
>
> With --parallel --buffer the test runner should report the same clear
> RuntimeError stack traces shown when buffering is disabled.
>
> **Actual behaviour**
>
> The run aborts with an AttributeError deep inside unittest.result, and
> the real test failures are swallowed.
>
> ** Additional details **
>
> * tblib installed (latest version == 3.1.0)
> * logging => logging.StreamHandler
> * Removing either --parallel or --buffer avoids the issue.
>
> Similar issue reported here: https://code.djangoproject.com/ticket/35794
New description:
Similar issue reported here: https://code.djangoproject.com/ticket/35794
If a test class raises an exception in setUpTestData(), the failure is
reported correctly when tests are executed
• in sequence, or
• in parallel without buffering (--parallel only).
However, running the same suite with both **--parallel and --buffer**
causes the test run to abort with an unrelated AttributeError, and the
original exception is lost.
Minimal reproducer
{{{
# tests/test_issue.py
from django.test import TestCase
class AbortingTest(TestCase):
@classmethod
def setUpTestData(cls):
raise RuntimeError("Boo!")
def test_pass(self):
pass
class AnotherAbortingTest(TestCase):
@classmethod
def setUpTestData(cls):
raise RuntimeError("Boo Too!")
def test_pass(self):
pass
}}}
the errors are reported clearly when running tests in sequence or
--parallel **without --buffer**
{{{
======================================================================
ERROR: setUpClass
(investment.investment.tests.test_issue.AnotherAbortingTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File
"/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/suite.py",
line 166, in _handleClassSetUp
setUpClass()
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/test/testcases.py", line 1426, in setUpClass
cls.setUpTestData()
^^^^^^^^^^^^^^^^^
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/Indiana/investment/investment/tests/test_issue.py", line
16, in setUpTestData
raise RuntimeError("Boo Too!")
^^^^^^^^^^^^^^^^^
RuntimeError: Boo Too!
======================================================================
ERROR: setUpClass (investment.investment.tests.test_issue.AbortingTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File
"/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/suite.py",
line 166, in _handleClassSetUp
setUpClass()
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/test/testcases.py", line 1426, in setUpClass
cls.setUpTestData()
^^^^^^^^^^^^^^^^^
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/Indiana/investment/investment/tests/test_issue.py", line
7, in setUpTestData
raise RuntimeError("Boo!")
^^^^^^^^^^^^^^^^^
RuntimeError: Boo!
----------------------------------------------------------------------
Ran 0 tests in 4.715s
FAILED (errors=2)
}}}
❌ Fails (parallel **with** buffer)
python manage.py test tests.test_issue --parallel --buffer
{{{
Destroying test database for alias 'default'...
Traceback (most recent call last):
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/Indiana/manage.py", line 34, in <module>
main()
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/Indiana/manage.py", line 29, in main
execute_from_command_line(sys.argv)
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/core/management/__init__.py", line 442, in
execute_from_command_line
utility.execute()
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/core/management/__init__.py", line 436, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/core/management/commands/test.py", line 24, in
run_from_argv
super().run_from_argv(argv)
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/core/management/base.py", line 416, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/core/management/base.py", line 460, in execute
output = self.handle(*args, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/core/management/commands/test.py", line 63, in handle
failures = test_runner.run_tests(test_labels)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/test/runner.py", line 1099, in run_tests
result = self.run_suite(suite)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/test/runner.py", line 1026, in run_suite
return runner.run(suite)
^^^^^^^^^^^^^^^^^
File
"/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/runner.py",
line 240, in run
test(result)
File
"/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/suite.py",
line 84, in __call__
return self.run(*args, **kwds)
^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/test/runner.py", line 562, in run
self.handle_event(result, tests, event)
File "/Users/[email protected]/dell/home/rsoriano/repositorios
/docker-indiana/venvs/indiana_3_12/lib/python3.12/site-
packages/django/test/runner.py", line 586, in handle_event
handler(test, *args)
File
"/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/runner.py",
line 101, in addError
super(TextTestResult, self).addError(test, err)
File
"/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/result.py",
line 17, in inner
return method(self, *args, **kw)
^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/result.py",
line 116, in addError
self.errors.append((test, self._exc_info_to_string(err, test)))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/opt/homebrew/Cellar/[email protected]/3.12.11/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/result.py",
line 195, in _exc_info_to_string
output = sys.stdout.getvalue()
^^^^^^^^^^^^^^^^^^^
AttributeError: '_io.TextIOWrapper' object has no attribute 'getvalue'
}}}
* The traceback contains no reference to the original RuntimeError("Boo!")
/ RuntimeError("Boo Too!").
**Expected behaviour**
With --parallel --buffer the test runner should report the same clear
RuntimeError stack traces shown when buffering is disabled.
**Actual behaviour**
The run aborts with an AttributeError deep inside unittest.result, and the
real test failures are swallowed.
** Additional details **
* tblib installed (latest version == 3.1.0)
* logging => logging.StreamHandler
* Removing either --parallel or --buffer avoids the issue.
Similar issue reported here: https://code.djangoproject.com/ticket/35794
Edit:
issue also happens with exceptions inside setUpClass (--parallel --buffer)
{{{
class AbortingTest(TestCase):
@classmethod
def setUpClass(cls):
raise RuntimeError("Boo!")
def test_pass(self):
pass
}}}
--
--
Ticket URL: <https://code.djangoproject.com/ticket/36491#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/django-updates/01070197d4910350-56bf5cd3-afdb-4124-8504-cdcb7510185e-000000%40eu-central-1.amazonses.com.