Thx Chris - this expresses very well how I look at it.

geir

Chris Gray wrote:
On Monday 27 March 2006 10:14, Anton Avtamonov wrote:
On 3/27/06, Geir Magnusson Jr <[EMAIL PROTECTED]> wrote:
[SNIP]

I don't think it's easier to write test cases for internals though a
public API, because you can call the internal methods directly to see if
they do as they promise, where it's not so easy to always have the same
thing happen through an indirect public API.

Also, wrt things breaking..... yes, tests that ensure that something
works as expected will need to change if the expectation changes.

That also is exactly what you want, right?  To know if you broke a
'internal contract' in a class?
Hmmm... Lemme support Richard's point.

Now let me support Geir's.

At the first, internals not just specify 'internal functional
contracts', but design decisions. Making redesign you will probably
have some (design-dependent) unit tests failing, despite functionality
is not changed.

In a complex piece of software it is extremely valuable to have internal interfaces which are rather stable - for example the VMI or equivalent, interfaces with the thread management system, memory management/GC, JIT compiler where present, etc.. These do indeed have the nature of "internal functional contracts", because each subgroup of developers trusts the other groups not to change these interfaces without warning. The contract can be changed without reference to external parties, but it is still a contract. If you change the implementation of some component and do not intend to change the contract, it is extremely useful to have tests which verify that this is so.

For the Wonka VM we had such tests for the internal threading API and for the abstract data types (hashtable, fifo, etc.) which were used intensively, and they proved extremely valuable. They are especially valuable if you take the "first make it correct, then make it time-/space-efficient" approach, so that one group can work on tweaking a particular component without disturbing the others. We completely re-implemented Wonka's string pool a couple of times without having to rewrite the rest of the VM.

At the second, what we really need to satisfy is API behavior only.
Internal implementation is not significantly important if public part
works fine. I fond of XP and test-driven development and don't feel
that we need to test something which is not part of requirements :-).
[...]

I'm not fond of initials, but I am fond of testing stuff at multiple levels - each module or component must do its thing, and together they must satisfy the requirements. If you build a complex system out of untested components and test only the final result, disaster beckons.

Sometimes, it is really desire to write an 'internal' test. For
instance, if you use some sorting algoritms, or algoritms which find
next match, etc. In this case such 'utility' stuff might be tested
independently from the points of usage. However I believe that is not
'general case'.

It may not be general, but there are enough specific instances to make it worthwhile having a systematic way to do such tests.

Note that I am not advocating full white-box testing, in which you check the state of every internal variable after every stimulus - that really is a waste of time. I'm advocating black-box testing of internal interfaces which are important enough to be worth documenting.

Cheers,

Chris

Reply via email to