Package: nose-progressive
Give your tests a progress bar and smarter tracebacks in 3 lines:pip install nose-progressive
cd your_project
nosetests --with-progressivenose-progressive is anoseplugin which displays progress in a stationary bar,
freeing the rest of the screen (as well as the scrollback buffer) for the
compact display of test failures, which it formats beautifully and usefully. It
displays failures and errors as soon as they occur and avoids scrolling them
off the screen in favor of less useful output. It also offers a number of other
human-centric features to speed the debugging process.The governing philosophy of nose-progressive is to get useful information onto
the screen as soon as possible and keep it there as long as possible while
still indicating progress.FeaturesProgress Barnose-progressive indicates progress in a stationary progress bar at the bottom
of the screen. It supports a wide variety of terminal types and reacts to
terminal resizing with all the grace it can muster. And unlike with the
standard dot-strewing testrunner, you can always see what test is running.Tracebacks: Prompt, Pretty, and Practicalnose, like most testrunners, typically waits until the bitter end to show error
and failure tracebacks, which wastes a lot of time in large tests suites that
take many minutes to complete. We show tracebacks as soon as they occur so you
can start chasing them immediately, and we format them much better:Judicious use of color and other formatting makes the traceback easy to scan.
It’s especially easy to slide down the list of function names to keep your
place while debugging.Omitting theTraceback (most recent call last)line and using relative
paths (optional), along with many other tweaks, fits much more in limited
screen space.Identifying failed tests in a format that can be fed back to nose makes it
easy to re-run them:FAIL: kitsune.apps.wiki.tests.test_parser:TestWikiVideo.test_video_englishTo re-run the above, do this:nosetests --with-progressive kitsune.apps.wiki.tests.test_parser:TestWikiVideo.test_video_englishThe frame of the test itself always comes first; we skip any setup frames
from test harnesses and such. This keeps your concentration where it counts.
Also, like unittest itself, we hide any frames that descend into trivial
comparison helpers likeassertEquals()orassertRaises().(We’re actually better at it than unittest. We don’t just start hiding
frames at the first unittest one after the test; we snip off only the last
contiguous run of unittest frames. This lets you wrap your tests in the
decorators from the mock library, which masquerades as unittest, and still
see your tracebacks.)Editor shortcuts (see below) let you jump right to any problem line in your
editor.Editor ShortcutsFor each frame of a traceback, nose-progressive provides an editor shortcut.
This is a combination of a filesystem path and line number in a format
understood by vi, emacs, the BBEdit command-line tool, and a number of other
editors:vi +361 apps/notifications/tests.py  # test_notification_completenessJust triple-click (or what have you) to select the line, and copy and paste it
onto the command line. You’ll land right at the offending line in your editor
of choice. As a bonus, the editor shortcut is more compact than the stock
traceback formatting.You can set which editor to use by setting any of these, which nose-progressive
checks in order:The--progressive-editorcommandline optionTheNOSE_PROGRESSIVE_EDITORenvironment variableThe$EDITORenvironment variableCustom Error Classesnose-progressive fully supports custom error classes like Skip and
Deprecated. We note the tests that raise them in realtime, just like normal
errors and failures:TODO: kitsune.apps.sumo.tests.test_readonly:ReadOnlyModeTest.test_login_errorHowever, when an error class is not considered a failure, we don’t show it
unless the--progressive-advisoriesoption is used, and, even in that case,
we don’t show a traceback (since usually the important bit of information isthatthe test was skipped, not the line it was skipped on). This stems from
our philosophy of prioritizing useful information.Custom error classes are summarized in the counts after the run, along with
failures and errors:4 tests, 1 failure, 1 error, 1 skip in 0.0s
         ^^^^^^ Bold ^^^^^^The non-zero counts of error classes that represent failures are bold to draw
the eye and to correspond with the bold details up in the scrollback. Just
follow the bold, and you’ll find your bugs.Django Supportnose-progressive can run your Django tests viadjango-nose. Just install
django-nose, then run your tests like so:./manage.py test --with-progressive --logging-clear-handlersInstallationpip install nose-progressiveOr, get the bleeding-edge, unreleased version:pip install -e git://github.com/erikrose/nose-progressive.git#egg=nose-progressiveUpgradingTo upgrade from an older version of nose-progressive, assuming you didn’t
install it from git:pip install --upgrade nose-progressiveUseThe simple way:nosetests --with-progressiveMy favorite way, which suppresses any noisy log messages thrown by tests unless
they fail:nosetests --with-progressive --logging-clear-handlersTouse nose-progressive by default, addwith-progressive=1to.noserc.OptionsGeneral Options--progressive-editorThe editor to use for the shortcuts in tracebacks. Defaults to the value of$EDITORand then “vi”. Equivalent environment variable:NOSE_PROGRESSIVE_EDITOR.--progressive-absDisplay paths in traceback as absolute, rather than relative to the current
working directory. This lets you copy and paste it to a shell in a different
cwd or to another program entirely. Equivalent environment variable:NOSE_PROGRESSIVE_ABSOLUTE_PATHS.--progressive-advisoriesShow even non-failure custom errors, like Skip and Deprecated, during test
runs. Equivalent environment variable:NOSE_PROGRESSIVE_ADVISORIES.--progressive-with-stylingnose-progressive automatically omits bold and color formatting when its
output is directed to a non- terminal. Specifying--progressive-with-stylingforces such styling to be output regardless.
Equivalent environment variable:NOSE_PROGRESSIVE_WITH_STYLING.--progressive-with-barnose-progressive automatically omits the progress bar when its output is
directed to a non-terminal. Specifying--progressive-with-barforces the
bar to be output regardless. This option implies--progressive-with-styling. Equivalent environment variable:NOSE_PROGRESSIVE_WITH_BAR.Color OptionsEach of these takes an ANSI color expressed as a number from 0 to 15.--progressive-function-color=<0..15>Color of function names in tracebacks. Equivalent environment variable:NOSE_PROGRESSIVE_FUNCTION_COLOR.--progressive-dim-color=<0..15>Color of de-emphasized text (like editor shortcuts) in tracebacks. Equivalent
environment variable:NOSE_PROGRESSIVE_DIM_COLOR.--progressive-bar-filled=<0..15>Color of the progress bar’s filled portion. Equivalent environment variable:NOSE_PROGRESSIVE_BAR_FILLED_COLOR.--progressive-bar-empty=<0..15>Color of the progress bar’s empty portion. Equivalent environment variable:NOSE_PROGRESSIVE_BAR_EMPTY_COLOR.Advanced FormattingIf you can’t get what you want with the above options—for example, if your
editor needs a different line number syntax—you can replace the entire
template that controls the editor shortcut lines of the traceback. You can evenrig clickable URLsin most terminalsthat take you straight to the right line in
your editor, without even the bother of copy and paste.--progressive-editor-shortcut-template='<template>'<template>is aformat stringas accepted bystr.format(). Equivalent environment variable:NOSE_PROGRESSIVE_EDITOR_SHORTCUT_TEMPLATE.The default template is…'  {dim_format}{editor} +{line_number:<{line_number_max_width}} {path}{normal}{function_format}{hash_if_function}{function}{normal}'Here are the available keys:dim_formatA terminal formatting sequence for de-emphasized text.
Affected by--progressive-dim-color.editorYour editor, set through--progressive-editorand$EDITORfunctionThe name of the function referenced by this stack
framefunction_formatA terminal formatting sequence for the function name.
Affected by--progressive-function-color.hash_if_function'  # 'if this frame has afunctionwith a
name; empty otherwise. Useful for commenting out the
function name at the end of a line.line_numberThe line number of the instruction this stack frame
referencesline_number_max_widthThe maximum width, in characters, of the line numbers
in the traceback currently being formatted. Useful for
aligning columns.normalA terminal escape sequence that turns off all special
formatting. A shortcut forterm.normal.pathThe path to the file this stack frame references.
Affected by--progressive-abs.termAblessingsTerminalobject, through which you can access any
terminal capability, even compound ones such asterm.bold_blue_on_bright_red. This is your escape
hatch to wild and crazy things beyond mere colors.Caveats and Known BugsMakes a cosmetic mess when used withipdb. Considerpdbppinstead.Some logging handlers will smear bits of the progress bar upward if they
don’t print complete lines. I hope to fix this with some monkeypatching, but
in the meantime, passing--logging-clear-handlersworks around this.Having trouble? Pop over to theissue tracker.KudosThanks to Kumar McMillan for hisnose-nicedotsplugin, which provided
inspiration and starting points for the path formatting. Thanks to my
support.mozilla.com teammates for writing so many tests that this became
necessary. Thanks to Jeff Balogh for django-nose, without which I would have
had little motivation to write this.AuthorErik Rose, while waiting for tests to complete ;-)Version History1.5.2Handle KeyboardInterrupt more gracefully. (Alexander Artemenko)Look up exception messages more compatibly with Python 3.4. (Paul Weaver)Gracefully handle proxied SyntaxErrors when using the logcapture plugin. (Lucas Taylor)Add LICENSE to MANIFEST.in. (Sanny Kumar)1.5.1Avoid a TypeError when running nose-progressive from withininvoke,
which obscures the terminal size.Fix a Unicode error when running setup.py inside Fedora’smocktool.1.5Add the--progressive-editor-shortcut-templateoption, letting you
completely customize the editor shortcuts. Now we support any text editor
that has a go-to-line option, no matter how it’s spelled.Drop support for Python 2.5. We needed modern string formatting.Add first-class support for Python 3.2.3 and higher. It turned out my tox
config was just wrong.Tolerate Nones in traceback components: file names and code extracts
particularly. (Kyle Gibson)1.4.3Fix bar not showing up in Python 3.Add honest-to-goodness, tox-tested support for Python 3.3. 3.2 may come
later. 3.1 and earlier won’t, because its stdlib hadn’t got its curses act
together yet.1.4.2Clear the TestLoader’s path cache (new in nose 1.3.0) after counting the
tests. This solves the problem of finding 0 tests to run under nose 1.3.0.Make progress bar tests less brittle so they don’t falsely fail on OS X
10.8 or other platforms where the terminfo isn’t exactly what I wrote the
test under.1.4.1Fix the “AttributeError: ‘dict’ object has no attribute ‘raw_input’” error
that sometimes occurred at pdb breakpoints. Thanks to David Baumgold for
finding the cause!1.4Make the final “OK!” green and bold. This helps me pick it out faster.Warn when using--with-idand--verbosity=2or higher. (Jason Ward)Add experimental Python 3 support. Functionality might work, but
tests need to be ported to pass.Allow other nose plugins to process the test loader. (Ratnadeep Debnath)Show parameter values in the names of generated tests. (Bruno Binet)Tolerate a corner case in skipped tests without crashing. (Will
Kahn-Greene)Swallow chars that don’t decode with UTF-8 when printing tracebacks: both
in filenames and source code. (Thanks to Bruno Binet for some patches
inspiring a rethink here.)1.3Redo progress bar. Now it is made of beautiful terminal magic instead of
equal signs. It looks best when your terminal supports at least 16 colors,
but there’s a monochrome fallback for fewer. Or, you can customize the
colors using several new command-line options.Fix a Unicode encoding error that happened when non-ASCII chars appeared in
traceback text. (Naoya INADA)1.2.1Tolerate empty tracebacks in the formatter. This avoids exacerbating
crashes that occur before any test frames.1.2Fix Python 2.5 support. (David Warde-Farley)Fix display of skipped tests in Python 2.7.Require nose 0.11.0 or greater. Before that, test counting didn’t work
sometimes when test generators were involved. (David Warde-Farley)Hide the progress bar by default when not outputting to a terminal. This
lets you redirect nose-progressive’s output to a file or another process
and get a nice list of tracebacks.Add an option for forcing the display of terminal formatting, even when
redirecting the output to a non-terminal.Factor out the terminal formatting library intoits own package.Start using tox for testing under multiple versions of Python.1.1.1Fix a bug that would cause the formatter to crash on many SyntaxErrors.
This also improves the heuristics for identifying the test frame when
there’s a SyntaxError: we can now find it as long as the error happens at a
frame below that of the test.1.1You can now set the editor nose-progressive uses separately from the$EDITORshell variable.1.0Every stack frame is now an editor shortcut. Not only does this make it
easier to navigate, but it’s shorter in both height and width.Reformat tracebacks for great justice. Subtle coloring guides the eye down
the list of function names.Hide unittest-internal and other pre-test stack frames when printing
tracebacks. Fewer frames = less noise onscreen = less thinking = win!Add an option to use absolute paths in tracebacks.0.7Pick the correct stack frame for editor shortcuts to syntax errors. Had to
handle syntax errors specially, since they don’t make it into the traceback
proper.Show the actual value of the $EDITOR env var rather than just “$EDITOR”.
I’m hoping it makes it a little more obvious what to do with it, plus it
gives a working default if $EDITOR is not set. Plus plus it doesn’t explode
if you have flags in your $EDITOR, e.g.bbedit-w.0.6.1Fix a crash triggered by a test having no defined module. –failed should
always work now.0.6Major refactoring. nose-progressive now has its own testrunner and test
result class. This makes it fully compatible with thecaptureplugin
and other plugins that make output.Fully support custom error classes, like Skips and Deprecations. They are
printed during the test run, bolded if they represent failure, and
summarized in the counts after the run.Tests which write directly to stderr or stdout no longer smear the progress
bar.Add $EDITOR to editor shortcut: no more typing!Work with tests that don’t have an address() method.Work with tests that return a null filename from test_address().Don’t pave over pdb prompts (anymore?).Don’t obscure the traceback when the @with_setup decorator on a test
generator fails.0.5.1Fix a crash on error when file of a stack frame or function of a test are
None.0.5Guess the frame of the test, and spit that out as the editor shortcut. No
more pointers to eq_()!More reliably determine the editor shortcut pathname, e.g. when running
tests from an egg distribution directory.Embolden bits of the summary that indicate errors or failures.0.4Add time elapsed to the final summary.Print “OK!” if no tests went ill. I seem to need this explicit affirmation
in order to avoid thinking after a test run.In the test failure output, switch the order of the line number and file
name. This makes it work with the BBEdit command-line tool in addition to
emacs and vi.0.3.1Cowboy attempt to fix a crasher on error by changing the entry_point to
nose.plugin.0.100.3Progress bar now works with plain old nosetests, not just django-nose.
Sorry about that!Stop printing the test name twice in the progress bar.Add basic terminal resizing (SIGWINCH) support. Expanding is great, but
contracting is still a little ugly. Suggestions welcome.0.2Real progress bar!Don’t crash at the end when--no-skipsis passed.Print the exception, not just the traceback. That’s kind of important. :-)Don’t crash when a requested test doesn’t exist.0.1.2More documentation tweaks. Packagelong_descriptionnow contains
README.0.1.1Add instructions for installing without git.Change package name in readme to the hypenated one. No behavior changes.0.1Initial release