|
|
|
|
|
by frankdejonge
1019 days ago
|
|
Most solutions on their own don't improve things a whole lot. Yet, in a system of supporting practices, it can be very powerful. The primary thing is you need a system, not just the individual parts. Testing without changing the design of your code is a horrible experience. Applying techniques like dependency inversion/injection has a positive effect on isolating behaviour which makes testing easier. Making code more deterministic makes tests easier. Pushing out side-effect from your core logic makes testing easier. All of those things add up to more than the sum of it's part, which is the an indication of dealing with a system. |
|
My main gripe with it is the second-order concern that it encourages testing practices that are frankly not very intelligent.
How you should approach testing depends on what kind of function you are testing. Pure functions of their inputs should be tested with property-based tests. If you have
the whole rigmarole of "make a test that fails, then write the least amount of code that makes it pass" brings you to something like: and so on, where what you really want is to say something like: This obviously works less well when you have to deal with the real world, but even in that case TDD leaves you with a patchy and inflexible approach.