There's another thing. If you accidentally put a yield in a test_*()
method, and you are using the default test runner, it will silently succeed
without doing anything (since calling it just creates the generator object
without starting the code). That's annoying. I personally think that this
should be automatic failure, and I think the unittest package should be
modified to trap this.


On Sat, Jul 26, 2014 at 1:36 PM, Glyph <gl...@twistedmatrix.com> wrote:

>
> On Jul 25, 2014, at 7:46 AM, Tobias Oberstein <tobias.oberst...@gmail.com>
> wrote:
>
> E.g., for integration tests, we (Autobahn|Python) have Autobahn|Testsuite,
> which actually tests interaction of components over the network.
>
> For low-level (per function) testing, we have (synchronous) unit tests.
>
> But there is a gap between those latter two.
>
> It is this level of testing that I am missing.
>
>
> This is the reason that this feature still exists, despite its use being
> "discouraged".
>
> I'm putting "discouraged" in scare quotes because it's not really that we
> discourage using it, it's that we discourage using it for the wrong reasons
> - but almost everyone uses it for the wrong reasons, so it's easier just to
> say "don't do it*" "*: actually do it sometimes" than to try to always
> explain the cases where you might want to use it.
>
> It's not a bad feature.  In fact it's a great feature!  But it's a great
> feature for integration testing, not a great feature for unit testing.
>  Integration testing is something you should do *after* you have a fully
> working unit test suite and the components all work as you expect in
> isolation, and you are ready to make sure that they fulfill their system
> contracts - in other words, you do it to experimentally discover gaps in
> your unit tests, not as part of test-driven design.
>
> The only time I've ever used Deferred-returning tests on a regular basis
> and not had nightmares about it was when I was testing a system that made
> heavy use of an asynchronous external database, and particularly made heavy
> use of features of PostgreSQL which could not be easily mocked within an
> in-process synchronous database such as SQLite.  I felt OK about it because
> there were low-level tests that exhaustively tested the database binding to
> make sure there were never any application-level surprises.  I knew that
> those low-level tests worked because none of the high-level
> Deferred-returning tests ever failed intermittently despite being run on a
> wide array of hardware :-).
>
> Anyway, to make a long story short, returning a Deferred from a test is a
> very advanced, somewhat risky feature that you should use only if you have
> no other tools at your disposal that do what you want to do.  And there are
> probably more tools to do what you want to do than you might initially
> think :).
>
> Happy testing,
>
> -glyph
>
>


-- 
--Guido van Rossum (python.org/~guido)

Reply via email to