LiveServerTestCase handles error messages inconsistently
|Reported by:||Jeremy Bowman||Owned by:||Jeremy Bowman|
|Has patch:||yes||Needs documentation:||yes|
|Needs tests:||no||Patch needs improvement:||no|
There are a few different ways that messages can be output when running LiveServerTestCase, and they aren't currently handled consistently:
- Messages that are created via the logging module are handled normally with the exception of console output, which is typically captured by the test runner and shown only for failures. This is usually what is desired.
- Request status messages are normally sent to stdout by Django's WSGIRequestHandler, but QuietWSGIRequestHandler doesn't output them at all to avoid interfering with the test runner output. This makes the information unavailable when debugging test failures.
- PEP 333 (WSGI) suggests sending error messages to the wsgi.errors stream, which even for QuietWSGIRequestHandler is currently stderr. These can interfere with the test runner output.
- Some less serious errors instead get sent to socketserver.BaseServer.handle_error() (inherited by WSGIServer), which since at least Python 2.7 has sent different parts of the output directly to stdout and stderr (there's a comment in the CPython source pointing out that this is less than ideal). Errors like "[Errno 32] Broken pipe" (which sometimes happens when a browser cancels a request before it finishes) can end up here and really clutter the test output.
None of this should go to stderr or stdout when running a LiveServerTestCase, and most (maybe all) of it should be available via the configured logging handlers (probably via the "django.request" logger).