Tony Bowden wrote:
>
> One other interesting idea I had, although I have no idea how
> practical it is at all really, it to have some way of telling from the
> Devel::Cover reports (or otherwise) what tests aren't actually adding
> any value as the stuff they're testing is already adequately tested
> elsewhere.
Practically, the only way to do this is to save the results of each test
in a seperate cover_db and then selectively merge them to see whether or
not your coverage changed. Even then, finding the minimal set of tests
that provides "full" coverage is a trial and error, brute force
approach. Actually, I think it's equivilant to the knapsack problem.
>From a testing perspective, this is secondary anyway. There are two
distinct types of testing: functional and structural. Functional testing
proves that the code does what it's supposed to. Structural testing
shows that the code was exercised to some arbitrary level.
What's important to remember is that functional and structural coverage
are *different* things. Having full functional coverage doesn't mean you
have full structural coverage, and vice-versa. e.g. take this code
if ($foo < 10) {
do_a();
#...
do_b();
}
with this test:
$foo = 0;
# test effects of do_a()
$foo = 1;
# test effects of do_a()
You'll get full structural coverage, but that's incidental. You haven't
shown that sub do_b() does what it's supposed to.
I would question whether it's necessary to gather structural coverage
every time the test suite is run. However much you might optimize it,
there will always be a lot of overhead associated with doing that. It
would seem reasonable for the regression tests to be run without
collecting structural coverage for the normal, day-to-day checks. Then,
before each release, rerun the test suite with it to ensure that you've
properly exercised the code.
Further, you could figure out the minimum set of tests that provide full
structural coverage and run just those, but there's a tradeoff. If it
takes longer to figure out which tests to run than it does to run the
tests, it's not worth the effort. Fully automated test suites also tend
to make it not worth the effort. (Who cares if the test suite takes 10
minutes or 10 hours if you let it run overnight?)
If the code has been properly designed (i.e. factored into separate
pieces without lots of ugly interdependancies) it should be possible to
run the module-level[1] test for that piece when it changes, not the full-
out test suite for the entire product. Again, that could be saved for
the release process.
[1] By "module" I don't mean a Perl module, I mean a logical component
of the overall product. That _might_ be a single Perl module, but it
could be none, or ten.
-mjc