I'm a big fan of testing units in isolation.  It's easier, faster, and tends to
more comprehensive and detailed tests.  The problem is, if the unit being
tested has a legitimate dependency on another unit in the suite, isolation
testing cannot identify interface changes.

This has bothered me for a while.  There had to be a way to identify these
dependencies without substantially increasing the complexity of the tests.  It
should be as automated as possible while still allowing a sufficient level of
detail.

I've come up with a scheme that could be an 80% solution.  It's called
Test::Depend.  It's based on Test::Builder.  Here's my preliminary feature list:

 - wrap around use_ok() to find out which module is being tested
 - save information about module being tested
    - version (if present)
    - number of tests: total, passed, failed, skipped
    - last modified timestamp
    - look in %INC to see which modules may have been mocked
      - values that aren't paths are probably mocked
      - these represent dependencies
 - write a test (999zzz.t) to explore dependencies
    - must run after all tests
    - compares saved file information with that from the most recent run
 - allow finer grained dependency checking ?
    - mark sections in tests AS dependencies
       - 'Foo::open'

Taking an average test suite as an example, we could have 'foo.t' and 'bar.t',
testing Foo.pm and Bar.pm respectively.  Bar depends on Foo, and bar.t mocks a
couple of methods of Foo.

If bar.t uses Test::Depend, it'll pick up several things:
  - the module being tested (assumed from a use_ok() or require_ok() call)
  - the module being mocked (assumed from an entry in %INC)

If there's no dependency information, it'll use the current version of Foo.pm,
the last modified timestamp of the test file, and the test status of foo.t (if
it also uses Test::Depend) to keep track of any changes to Foo.pm.

If this dependency information changes, it'll fail a test (or maybe warn)
because there's a potential interface change that Bar.pm may need to know.

Like I said earlier, I'm aiming for an 80% solution.  There are some
assumptions and some fragilities here, but it represents a great improvement
over the current system, in my mind.

I welcome any comments.

-- c

Reply via email to