[Dev] Mock Reactor for tests?
Phillip J. Eby
pje at telecommunity.com
Mon Jun 6 15:07:12 PDT 2005
At 02:27 PM 6/6/2005 -0700, John Anderson wrote:
>It also seems like our tests would be more valid if we were using real
>Twisted code instead of something else.
That would be a true statement if we were only talking about integration
tests. However, there is a difference between unit testing and integration
testing. Unit testing tests components in isolation, integration testing
tests them with other components. Unit testing promotes development speed,
architectural soundness, and developer confidence, while integration
testing supports quality assurance for code release. Unit tests should be
very, very fast, preferably with centisecond runtimes or better for
individual tests. Integration tests can be slower, although being fast is
always good.
Unit tests should always, always, always succeed, with never a broken
checkin. Integration tests, if they are also being used as acceptance
tests, can be allowed to fail, because acceptance tests are used to show
the degree of feature-completeness of a product, and in that case they
simply reflect unfinished features.
As a general rule of thumb, unit tests should be fast enough that one does
not feel burdened by running them after *every line or two* of new code
written, while integration tests should be comfortably run once a day, or
overnight.
Chandler currently has relatively few tests that qualify as unit tests; it
needs more. Chandler already has lots of integration tests, but they are
no substitute for actual unit tests.
Now, even if we are talking about integration tests, note that Brian's
tests use a "string transport", which is not "real" socket code, so by your
argument this would not be as "valid" as using sockets. But, if you say
that StringTransport is "real Twisted code" because it comes with Twisted,
then all we need to do is contribute a usable mock reactor and replacement
fixtures to the Twisted code base, at which point it will become "real
Twisted code". :)
A major idea in the concept of unit tests is to test things in isolation,
minimizing the number of external points of failure (such as external
servers, connectivity, etc.) for the test. Mock objects and stubs are a
typical practice for supporting unit tests of components with external
dependencies. The use of interfaces to define what is expected on each
side of such dependencies is a supporting practice.
The last time I did any significant work with Twisted, it had something
like 6 different reactor implementations and variations thereof. A mock
reactor would just be #7, or #8, or how many ever such implementations they
have now. Twisted is built on interfaces, which means that there are
behaviors that reactors are expected to provide and conform to, and which
all other components of Twisted can expect, and whose limits they may not
exceed. This means that it is a bug in Twisted if any part of Twisted does
not function correctly with implementation #N of the IReactor* interfaces.
More information about the Dev
mailing list