Re: Three Law of TDD - to strictly follow, or not?

"Colin Vipurs [email protected] [testdrivendevelopment]" <[email protected]> Wed, 27 Aug 2014 15:23:17 +0100
Newsgroups gmane.comp.programming.test-driven-development
Message-ID <CAKi4270NOBiD4eDZy_-W-2Zt+YMLkaSCntuurLnDw-g84htiWw@mail.gmail.com>
Answers inline.

> This is something I will let evolve as I add more tests.  It seems like
> the pain your coworker was feeling could be down to not refactoring the
> test itself.  Instantiating the class under test multiple times in a test
> is what I would consider to be duplication
>
> In some ways you're exactly correct. He could have used a factory method
> to extract out duplication in the creation code. But at other times no. He
> would sometimes write 15 tests for a method and then add a new parameter to
> the method under test resulting in the need to modify 15 tests. I believe
> he was doing too much iceberg testing -- that is, he was trying to test an
> "iceberg" through a small whole rather than testing the individual methods.
> He hadn't yet tied in how SRP and small units improve the overall TDD
> experience.
>

Again I would put that down to duplication.  It's extreme, but if I call a
method from 15 tests I see that as something that should be extracted.

>
> 1) Assuming each test has some setup -- each of those lines in the test
> needs to be "tested". In other words, we should be able to see a failure
> indicating that line in the test is necessary. If we have not seen the
> "failure" it's possible that we have made an error in the setup which
> increases the likelihood that we'll have to debug the test.
>

I'm not sure I'm following you here.  Doesn't the failing test diagnostics
provide this information/guarantee?

>
> 2) When we write the whole test without having supported it with the
> necessary production code, the production code, though testable, will not
> have had the same opportunity to evolve as it would have had it been
> co-developed with the tests. To put this another way and refer to J.B.
> Rainsberger's Queueing Theory post, we've lost the feedback loop between
> each line in the test and the production code. IMO, when we write the
> entirety of the test before writing any production code we're more likely
> to mentally create a design and go with it rather than letting it evolve
> fluidly.
>

> 3) When we don't co-develop the production code with the tests, we've also
> elongated the time between having a passing unit test and the corresponding
> implementation which again increases the likelihood that we'll need to
> debug something or attempt a jump that's too big.
>
>
I think both of these come down to how big your tests are and how much
functionality they're attempting to test in a single go.  To draw an
example, imagine I have a class that converts object A into object B - i
will have 1 test for each and every field and incrementally add the
conversion as I go.