Noeud:Look for Realism, Noeud « Next »:Ordering the Tests, Noeud « Previous »:Develop the Interface, Noeud « Up »:Designing a Test Suite
Voir Ariane 501, for a demonstration of the importance of realism in tests. While testing from the inside (with consistency checks or even tests embedded in the executables themselves) is a precious means to catch failures as early and as precisely as possible, realism should always be on your mind. There are always surprising bugs when putting together features which, individually, work perfectly. Only real uses are likely to reveal them. As a consequence, don't test the package, use it!
Bison (voir What is Bison) is a generator of C files, and a lot of
testing can be performed by simple checks performed on its input:
looking for specific lines etc. But this is not a real use, you'll miss
a lot of errors that way; the C output has to be exercised itself on
inputs that stress the parser.
Bypassing the official interface of the tools is extremely tempting, as
it usually makes it faster to write the tests or speeds up the test
suite. But sooner or later you might pay for that simplification,
either because you missed a bug triggered on actual input, or because
some inner detail of the program changed invalidating the test itself.
A valid and complete sequence would have kept the test valid since the
user interface is often kept backward compatible.
I once released a broken package: some of its files were not installed.
The test suite did not (and could not!) diagnose it. Why? Because I
wanted the test suite to run in the user's directory, where the user
built my package, before it was installed. To make this possible, the
test suite set a lot of environment variables, skipped the regular
PATH
use etc. Then of course, it was finding the files! It's
almost as if it were directly looking for them in the tarball.
My test suite was not a regular user, and because of this I could not use it on an installed version of my program. Actually, most test suites have exactly this problem: they are not regular users, they are biased users exercising the package under specific conditions.
Now my test suites rely on PATH
exclusively, like regular users.
But then, how to test a package before it is installed? First, add
small wrappers in your package, typically shell-scripts that set
environment variables and then run the real not yet installed binaries.
Then run the test suite after having set the PATH
so that these
wrappers are found first. Simple enough!
Be sadistic, be mean! Anything that can strengthen the test suite should
be used. If your programs have self-testing features, or simple sanity
checks such as a --warning
option, use them. Some users have
extremely surprising expectations, or are simply very demanding; they
might hit some limitations in your package. Precede such uses and write
torture tests, stretching the limits as far as possible. Many
bugs lie in the angles, at the extremes of the range of validity of your
routines: who has never been bitten by a <
where a <=
was
needed? The number of stupid bugs, silly "lacking the room for the
trailing \0" errors that torture tests catch is impressive1. It might even help realize you were about to waste a satellite
because of a single character typo, as recounted in Fortran and Satellites, something the tests did not reveal for lack of realism.
Users do make mistakes (occasionally). Not only should you exercise the
programs at the extreme of their validity domains, but you should also
test them on invalid situations. A program which fails to properly
reject invalid situations is broken. If you check only for valid
conditions you might release a program dying when given a nonexistent
filename. Sooner or later, you'll have to waste time answering zillions
of similar SEGV reports while a simple No such file or directory:
10^X^F
, or not a number: 10:wq
would have saved you from this
hassle.
Early Macintosh users might remember the so-called Monkey test: a simple program was randomly moving the mouse, clicking here and there. I don't remember having to wait for more than a few minutes to have to manually reboot my computer. Pose, the PalmOS emulator provides the same feature under the name of ``Gremlins mode''.