#29101: Beautify Django Test Output
-----------------------------------------+-----------------------------
Reporter: Rich Jones | Owner: nobody
Type: New feature | Status: new
Component: Uncategorized | Version: 2.0
Severity: Normal | Keywords: testing, ux
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 1
UI/UX: 1 |
-----------------------------------------+-----------------------------
''This is a feature request!''
There has been a lot of fantastic work in Django 2.0 towards making the
default interfaces web and command line interfaces more beautiful.
Excellent!
Unfortunately, it seems like this work has not been extended to the
"manage.py test" command, which still has very confusing and overwhelming
output!
I'm sure many of you have, like me, stared at the standard output (err?)
of a `test` command running through a complicated and conditional CI
system and wondered.. okay, but which test is this currently running? In
which module? Is that supposed to be included? Which tests got skipped?
Perhaps most annoyingly, especially for new developers, normal print()
statements don't appear in test output.
I also now make extensive use of the `tag` feature introduced in 1.10, but
there is no feedback in the CLI about which tags are being actively
included or excluded, how many total were skipped, etc.
Finally - there is no color in the output! Color has been added to great
effect to express success and error states for other manage.py commands -
why not for tests too? It'd be great to use green to indicate a passing
test, red to indicate a failed test, and yellow to indicate a skipped
test.
Currently, the experience is something like:
{{{
$ docker run \
--add-host=database:$DB_HOST_IP \
--add-host=nomad:$NOMAD_HOST_IP \
--env-file workers/environments/test \
--volume $volume_directory:/home/user/data_store \
--link drdb:postgres \
--link nomad:nomad \
-i dr_worker_tests python3 manage.py test "$@" -- exclude-tag=slow
--exclude-tag=star --no-input
Successfully tagged dr_worker_tests:latest
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
2018-02-01 21:15:48,342 local/MainProcess
data_refinery_workers.downloaders.array_express ERROR [downloader_job: 1]:
A Batch's file doesn't have the same download URL as the other batches'
files.
[ .. literally thousands of log statements .. ]
[ .. literally thousands of log statements .. ]
[ .. literally thousands of log statements .. ]
[ .. literally thousands of log statements .. ]
[ .. literally thousands of log statements .. ]
----------------------------------------------------------------------
Ran 39 tests in 474.636s
OK
Destroying test database for alias 'default'...
}}}
It would be so, so much nicer if the experience was something like:
{{{
$ docker run \
--add-host=database:$DB_HOST_IP \
--add-host=nomad:$NOMAD_HOST_IP \
--env-file workers/environments/test \
--volume $volume_directory:/home/user/data_store \
--link drdb:postgres \
--link nomad:nomad \
-i dr_worker_tests python3 manage.py test "$@" -- exclude-tag=slow
--exclude-tag=slower --no-input
Starting tests, excluding [slow, slower].
Running: test_download_file
(data_refinery_workers.downloaders.test_sra.DownloadSraTestCase)
----------------------------------------------------------------------
[ .. Related log and print statements .. ]
**OK!**
Running: test_download_other_file
(data_refinery_workers.downloaders.test_sra.DownloadSraTestCase)
----------------------------------------------------------------------
[ .. Related log and print statements .. ]
**OK!**
Skipping: super_long_test
(data_refinery_workers.downloaders.test_sra.DownloadSraTestCase)
Skipping: super_duper_long_test
(data_refinery_workers.downloaders.test_sra.DownloadSraTestCase)
Running: final_test
(data_refinery_workers.downloaders.test_sra.DownloadSraTestCase)
----------------------------------------------------------------------
[ .. Related log and print statements .. ]
**OK!**
----------------------------------------------------------------------
Ran **39** tests in **7 minutes, 54 seconds**. Skipped **2** tests.
**100%** success rate, great job!
}}}
Basically, turn what is currently just a massive, unintelligible wall of
unformatted text into something that can be easily parsed and understood
at a glance by a human.
A bonus would be to suppress unnecessary output (ex, "Destroying test
database for alias 'default'..." when it's default), include more
statistical and informative output, and use colorization and general
humanization and friendliness to improve the testing experience.
I don't think this would be too difficult to implement at all. In fact, I
think it'd be perfect for somebody looking to make their first
contributions, or for a team to work on as a sprint at a hackathon.
Thoughts?
Rich Jones,
New DSF Member!
--
Ticket URL: <https://code.djangoproject.com/ticket/29101>
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 post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/051.3ca9aa2fb151478147f2dde140f6cbfa%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.