-
Notifications
You must be signed in to change notification settings - Fork 278
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
tests: Prevent unittest --buffer
from crashing
#620
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, I confirm the problem (although Python documentation about sys.__stdout__
doesn't warn about potential issues).
And your fix seems to work!
I'm curious: why and when do you need --buffer
?
Before this change, if certain tests were failing in certain ways, then running “python -m unittest --buffer” would cause an AttributeError in the unittest module itself. Here’s what unittest does when you use the --buffer argument: 1. It sets sys.stdout and sys.stderr to StringIOs [1]. 2. It runs a test. 3. If the test failed, it runs getvalue() on sys.stdout and sys.stderr to get data from its StringIOs. tests/test_cli.py has its own RunContext class that does something similar. Before this change, here’s what could happen: 1. unittest sets sys.stdout and sys.stderr to StringIOs. 2. unittest runs a test that uses RunContext. 3. A RunContext gets entered. It sets sys.stdout and sys.stderr to its own StringIOs. 4. The RunContext gets exited. It sets sys.stdout and sys.stderr to sys.__stdout__ and sys.__stderr__. 5. The test fails. 6. unittest assumes that sys.stdout is still set to one of its StringIOs, and runs sys.stdout.getvalue(). 7. unittest crashes with this error: AttributeError: '_io.TextIOWrapper' object has no attribute 'getvalue' [1]: <https://github.com/python/cpython/blob/2305ca51448552542b2414186252123a8dc87db7/Lib/unittest/result.py#L65> [2]: <https://github.com/python/cpython/blob/2305ca51448552542b2414186252123a8dc87db7/Lib/unittest/result.py#L87>
af41c80
to
37c2d5e
Compare
I don’t know. I tried running the tests on my local system when I ran into #621. I tried using |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK!
Thanks for contributing 👍
Before this change, if certain tests were failing in certain ways, then running
python -m unittest --buffer
would cause anAttributeError
in theunittest
module itself.Here’s what
unittest
does when you use the--buffer
argument:sys.stdout
andsys.stderr
toStringIO
s.getvalue()
onsys.stdout
andsys.stderr
to get data from itsStringIO
s.tests/test_cli.py
has its ownRunContext
class that does something similar. Before this change, here’s what could happen:unittest
setssys.stdout
andsys.stderr
toStringIO
s.unittest
runs a test that usesRunContext
.A
RunContext
gets entered. It setssys.stdout
andsys.stderr
to its ownStringIO
s.The
RunContext
gets exited. It setssys.stdout
andsys.stderr
tosys.__stdout__
andsys.__stderr__
.The test fails.
unittest
assumes thatsys.stdout
is still set to one of itsStringIO
s, and runssys.stdout.getvalue()
.unittest
crashes with this error: