[Python-Dev] Fire, may I present accellerant. Accellerant, this is fire.
Mitchell Morris
mmorris@pop.mindspring.com
Fri, 28 Jul 2000 23:19:59 -0700
In general I try to keep my head down. I recently needed some
support for regression testing as part of a stealth Python
introduction-cum-advocacy effort. I wound up using Steve Purcell's
pyunit testing framework, and thought it was a shame that it wasn't
part of the standard distribution.
To that end ...
PEP: eric-the-half-a-pep
Title: Guido-blessed unit/regression test framework
Version: 0
Target of Opportunity: mmorris@mindspring.com (Mitchell Morris)
Python-Version: 2.0
Status: pre-pre-pre-Draft
Introduction
This proto-PEP advocates that there should be, in the standard
library, a unit/regression test framework. This Guido-blessed
framework would provide test semantics both useful and
standardized. In addition to being a useful structure in
it's own right, it would provide an obvious direction for
development projects to prepare and use their own regression
test policies.
Why Should I Care?
Software developers have known for quite some time that the
majority of our time is spent identifying and correcting
errors. Various suggestions for reducing this burden have
been explored and most of them have been rejected. One thing
that seems to provide some benefit is writing test plans
and running them against the software product. This doesn't
necessarily eliminate bugs, but it does allow us to find some
of them and insure they don't reoccur as we correct later ones.
One variation of this process is to extend the test plan
as other defects are identified and corrected. Part of the
correction would be updating the test suite to include a
test that would have identified and exercised the defect. In
this way the test plan grows to verify that correct behavior
increases monotonically.
This kind of test plan also allows very aggressive refactoring,
in that the developer can make sweeping changes to module
internals with great confidence that things will either (a)
not break elsewhere, or (b) break loudly when the unit tests
fail. Given the (relative) success of test plans and Python's
general friendliness to rapid development and refactoring,
there should be a standard tool in all distributions to
encourage this dynamic.
But ... Smalltalk and Java are Evil!
Kent Beck has recently generated a lot of press by writing
about his development methodology which he calls "Extreme
Programming"[1]. Aside from the unfortunate connotations
to sports which would still be completely anonymous without
ESPN2, there are a number of useful tools emerging from the
XP
camp. One of the prime tenets is that developers write their
classes and their unit tests at the same time. According to
XP, these unit tests have to run at 100% for the code to be
acceptable for integration.
The design of the testing framework generated by XP is fairly
simple: individual tests check the correct functionality of a
single quantum of testable behavior, usually public behavior.
These individual tests can be aggregated into suites, which
are also runnable. Suites can be aggregated as well. Tools
are provided to execute these tests and suites in both text
and GUI formats.
Kent Beck and Erich Gamma wrote a paper called "Test
Infected"[2] to demonstrate how the code and tests are
developed in tandem. This paper, written as a script for a
pair programming session, shows how the various pieces of the
JUnit implementation work together. (JUnit is the XP testing
tool for Java.)
We've Already Got One, Thanks.
The current distribution has a regression testing framework,
in Lib/test/regrtest.py, which addresses some of these same
issues. The obvious question is why not use the tool which is
already there? The current tool presents several issues that
make this a less-than-exemplary solution: it doesn't allow for
graphical manipulation, it separates test and expected result
into separate files stored in separate locations, and it tries
to generate the tests as well as run them. The objections to
regrtest.py then boil down to the it's philosophy.
We've Got More Than We Can Stand, Thanks. Really.
Also for our consideration is doctest.py, contributed by
the inestimable Tim Peters. doctest.py presents a simple
straightforward means to embed the individual tests into the
production code itself as commentary. This suggests that the
separation of test and result presents a cognitive dissonance
in other people besides just me. doctest.py doesn't provide
any mechanism, however, for aggregating several modules
into a single test run, nor does it provide a GUI. Once
again, additional effort could obviously provide the missing
functionality. On the other hand, doctest.py isn't currently
part of the standard distribution.
What's All This Then?
The point of this proposal is Steve Purcell's pyunit
package[3]. This is a Python implementation of XP's xUnit
specification. It provides a means for running individual
tests, aggregating individual tests into larger suites,
running those tests in both text and GUI modes, and keeps the
tests and expected results together in a single source module.
You Have A Point?
Yes: pyunit should be part of the standard library. pyunit
documentation should be included in the distribution. New
development should be encouraged to use pyunit. We should
all rub pyunit all over our bodies as often as we can.
Even if it isn't pyunit, Python should have a documented
standard component for unit and regression testing, and we
should encourage new development to use it, and we should
demand that core development include it.
References
1 -- XP Wiki
<URL:http://c2.com/cgi/wiki?ExtremeProgramming>
see also:
<URL:http://www.xprogramming.com/>
2 -- Beck, Kent and Gamma, Erich, "Test Infected"
<URL:http://members.pingnet.ch/gamma/junit.htm>
3 -- pyunit project at Source Forge
<URL:http://pyunit.sourceforge.net/>
pyromanically y'rs
+Mitchell