The Power of Test Driven Development (TDD)

Before I read the book by Kent Beck I was just thinking – pesky tests what are they good for apart from getting in the way?  What’s so good about Test Driven Development?

But writing tests isn’t what test-driven development is about. It’s actually about designing your code in a way that matches your expectations. It’s a powerful technique that, when understood, will transform the way you write code and design software.

NOTES

Kent Beck – Test Driven Development By Example:

https://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530

Github template repository:

https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-template-repository

QUOTES

00:54Because TDD is not about driving development through testing. It’s about designing and architecting your application. Through writing tests.” [RB]

02:12 – ” I find myself going backwards and forwards, making sure I understood every single step and what it meant in that first section.” [RB]

03:26 – “And so you carry on writing some more code. And eventually the whole thing becomes a great big ball of string. Lots of code and no tests.” [RB]

04:06 – “It’s more of a tool for a structured approach to design in the first place. ” [RB]

05:07 – “Writing a test helps show that it works. In fact, the word test is really wrong here. It’s more of a proof than it is a test.” [RB]

06:06 – “Writing code in TDD can initially feel slow and labored but in only a short time, you’ll start to notice the benefit.” [RB]

06:36 – “This is almost like the reverse Conway maneuver to Goldratt’s theory of constraints.” [RB]

08:02 – “Whatever we do, there has to be a low barrier to entry for testing.” [RB]

08:42 – “And this is the true power of TDD, rather than agonizing over design and architecture and advance” [RB]

09:12 – “TDD is an absolute no brainer” [RB]

Transcript
Richard Bown:

Hi, this is the software that every club, episode 22.

Richard Bown:

I'm your host Richard bound.

Richard Bown:

And this week, I'm talking all about the power of TDD, the

Richard Bown:

power of test driven development.

Richard Bown:

So what's so good about TDD.

Richard Bown:

I think before I read the book by kent back,

Richard Bown:

I was just thinking pesky tests, what are they good for

Richard Bown:

apart from getting in the way?

Richard Bown:

What are they good for?

Richard Bown:

Perhaps for proving we have control of our software.

Richard Bown:

Often we written it.

Richard Bown:

That we have thought about it and decided that we can automatically

Richard Bown:

prove works and is deployable.

Richard Bown:

perhaps the image problem that I've had with the idea of tests in the past.

Richard Bown:

And that there's something that you have to do after coding in order

Richard Bown:

it was to prove that it works.

Richard Bown:

this really isn't what test driven development is all about.

Richard Bown:

Maybe this is a misnomer of TDD test-driven development does not

Richard Bown:

describe what it's all about at all.

Richard Bown:

Maybe instead it should be called design through testing.

Richard Bown:

Because TDD is not about driving development through testing.

Richard Bown:

It's about designing and architecting your application.

Richard Bown:

Through writing tests.

Richard Bown:

There are lots of pluses to this technique and not many

Richard Bown:

drawbacks that I can think of.

Richard Bown:

Because it improves your design helps you get unstuck when you need help.

Richard Bown:

Plus, you've got your test passing and through refactored

Richard Bown:

and your code is written.

Richard Bown:

So you've done everything.

Richard Bown:

Sounds good.

Richard Bown:

Right?

Richard Bown:

So, what does this look like?

Richard Bown:

Sometimes when you're building an application, especially if it's on and

Richard Bown:

off, you're not doing it full time or perhaps you're distracted by production

Richard Bown:

support, or you have to do other things.

Richard Bown:

Perhaps it's an open source project.

Richard Bown:

It can get to a point where you can't see the way forward.

Richard Bown:

Or perhaps it's a case that when you come back to the code, you've

Richard Bown:

forgotten what it's supposed to do.

Richard Bown:

So how can TDD help with this?

Front Right - RODE NT-USB:

If you've read the book, test driven

Front Right - RODE NT-USB:

development, by example, by Kent Beck.

Front Right - RODE NT-USB:

Then at first it might all seem a bit obvious or perhaps a bit daunting.

Front Right - RODE NT-USB:

It's written in a chatty style, which may not make it the most obvious or

Front Right - RODE NT-USB:

easiest to follow in the first instance.

Front Right - RODE NT-USB:

It does require some work.

Front Right - RODE NT-USB:

You should get invested in the story a little bit.

Front Right - RODE NT-USB:

Once you do that and take your time with the exercises, particularly in

Front Right - RODE NT-USB:

the first parts of the book, then it will pay you back for your persistence.

Front Right - RODE NT-USB:

I find myself going backwards and forwards, making sure I understood

Front Right - RODE NT-USB:

every single step and what it meant in that first section.

Front Right - RODE NT-USB:

After a while it clicked for me.

Front Right - RODE NT-USB:

What I saw that this was a really clever way of designing code.

Front Right - RODE NT-USB:

And not just a way of making sure we have good code coverage.

Front Right - RODE NT-USB:

The first part of the book will tell you everything you need to know

Front Right - RODE NT-USB:

about TDD and why it's so powerful.

Front Right - RODE NT-USB:

The second part extends this knowledge without other paradigms.

Front Right - RODE NT-USB:

And the third gives you plenty of great examples.

Front Right - RODE NT-USB:

So, what does TDD do that is so different?

Front Right - RODE NT-USB:

If you're a programmer already, then you'll already be familiar

Front Right - RODE NT-USB:

of being in a coding zone.

Front Right - RODE NT-USB:

Perhaps when you put on your favorite least distracting music and you climb into

Front Right - RODE NT-USB:

your editor and your code excitedly, and you write and you write and write, and

Front Right - RODE NT-USB:

perhaps you test manually as you go along.

Front Right - RODE NT-USB:

But you don't formalize any of those tests, at least not straight away.

Front Right - RODE NT-USB:

You might grudgingly add some tests afterwards, but perhaps they're

Front Right - RODE NT-USB:

quite high level and abstracted.

Front Right - RODE NT-USB:

Perhaps you're kind of trying to scam the testing gods.

Front Right - RODE NT-USB:

And you're not too close to the actual core business or the domain language

Front Right - RODE NT-USB:

at the heart of your application.

Front Right - RODE NT-USB:

Then perhaps you come back to it later.

Front Right - RODE NT-USB:

And you want to get that coding feeling again.

Front Right - RODE NT-USB:

So you jumped straight back in.

Front Right - RODE NT-USB:

So the coding you want that coding high.

Front Right - RODE NT-USB:

And the coding high comes from writing the code, not the test.

Front Right - RODE NT-USB:

And so you carry on writing some more code.

Front Right - RODE NT-USB:

And eventually the whole thing becomes a great big ball of string.

Front Right - RODE NT-USB:

Lots of code and no tests.

Front Right - RODE NT-USB:

And you're not even sure what the original intention was anymore.

Front Right - RODE NT-USB:

So we're coding happily.

Front Right - RODE NT-USB:

And perhaps we end up in a blind alley and have to unpick our work,

Front Right - RODE NT-USB:

or sometimes even start again.

Front Right - RODE NT-USB:

This can feel like we're making progress, but not all the time.

Front Right - RODE NT-USB:

For solo coding, this can definitely happen.

Front Right - RODE NT-USB:

coding as part of a team, then this is less likely to happen

Front Right - RODE NT-USB:

because you do need to justify your code and your design decisions to

Front Right - RODE NT-USB:

othersthat you're working with.

Front Right - RODE NT-USB:

So TDD is therefore perhaps only useful for solo coders you may think.

Front Right - RODE NT-USB:

No, because it's more than it's all for just not getting stuck with a design.

Front Right - RODE NT-USB:

It's more of a tool for a structured approach to design in the first place.

Front Right - RODE NT-USB:

By taking your time with testing and design as you go you make

Front Right - RODE NT-USB:

it clear for everyone who works with the code in the future.

Front Right - RODE NT-USB:

So how does TTD differ from the code first or even a design first approach?

Front Right - RODE NT-USB:

Well, you write the test first and then you were tray one minus the time.

Front Right - RODE NT-USB:

To get passing tests.

Front Right - RODE NT-USB:

So you need to keep passing your test.

Front Right - RODE NT-USB:

As your north star.

Front Right - RODE NT-USB:

And without that indication, you just don't move on.

Front Right - RODE NT-USB:

So immediately TDD imposes a discipline on your coding.

Front Right - RODE NT-USB:

You can't any more, just keep writing code and hope that it works.

Front Right - RODE NT-USB:

You need to prove it to yourself at every single step

Front Right - RODE NT-USB:

. How does this help with your design and

Front Right - RODE NT-USB:

It sounds like it might be boring.

Front Right - RODE NT-USB:

It sounds like you might miss something important.

Front Right - RODE NT-USB:

And you're worrying about tests so how can this help?

Front Right - RODE NT-USB:

This is in fact, one of the key benefits.

Front Right - RODE NT-USB:

Proving the what your building will do.

Front Right - RODE NT-USB:

The thing that you're intending.

Front Right - RODE NT-USB:

Writing a test helps show that it works.

Front Right - RODE NT-USB:

In fact, the word test is really wrong here.

Front Right - RODE NT-USB:

It's more of a proof than it is a test.

Front Right - RODE NT-USB:

It's proving that the thing you've created will do the thing that you say it well,

Front Right - RODE NT-USB:

And the cool thing about this.

Front Right - RODE NT-USB:

Is it the test or proof makes you think more deeply about what the code you're

Front Right - RODE NT-USB:

going to write is exactly going to do.

Front Right - RODE NT-USB:

You're creating a specification for your code to fit into.

Front Right - RODE NT-USB:

And that specification means two things.

Front Right - RODE NT-USB:

When you do write the code, it virtually writes itself.

Front Right - RODE NT-USB:

And when you've written the code, you can tell immediately if it's

Front Right - RODE NT-USB:

working by running the test.

Front Right - RODE NT-USB:

And this covers the first two important mantras of TDD, which are right a test.

Front Right - RODE NT-USB:

Then write the code.

Front Right - RODE NT-USB:

The third important mantra.

Front Right - RODE NT-USB:

And the discipline is refactor.

Front Right - RODE NT-USB:

Ensure that the code is not only doing the right thing.

Front Right - RODE NT-USB:

But doing it in the right way for the rest of your code for the rest of your

Front Right - RODE NT-USB:

design for the future of your application.

Front Right - RODE NT-USB:

Writing code in TDD can initially feel slow and labored but in only a short

Front Right - RODE NT-USB:

time, you'll start to notice the benefit.

Front Right - RODE NT-USB:

Not only because you have a lot of tests.

Front Right - RODE NT-USB:

But also because you'll have an emergent design.

Front Right - RODE NT-USB:

The design itself comes from creating tests and thinking about what your

Front Right - RODE NT-USB:

code would do before you write it.

Front Right - RODE NT-USB:

You're creating your expectations as specifications about what the code can do.

Front Right - RODE NT-USB:

By approaching this through constraints, we help our brain focus on what we intend.

Front Right - RODE NT-USB:

This is almost like the reverse Conway maneuver to Goldratt's

Front Right - RODE NT-USB:

theory of constraints.

Front Right - RODE NT-USB:

We add a constraint, then we solve that constraint by fixing the functionality.

Front Right - RODE NT-USB:

Step-by-step we constrain our domain.

Front Right - RODE NT-USB:

We constrain our functional model.

Front Right - RODE NT-USB:

And we constrain our application to be the thing that we intended to, but I've

Front Right - RODE NT-USB:

never actually described to this point.

Front Right - RODE NT-USB:

Okay, before I get too philosophical about this.

Front Right - RODE NT-USB:

How can we do TDD practically?

Front Right - RODE NT-USB:

Well, it's important that you have a project in source control.

Front Right - RODE NT-USB:

A build system and a way of running tests against your projects.

Front Right - RODE NT-USB:

So with a source control system.

Front Right - RODE NT-USB:

You can baseline all of your changes.

Front Right - RODE NT-USB:

If you don't have source control, then we can't be sure that we're

Front Right - RODE NT-USB:

doing the change we intend.

Front Right - RODE NT-USB:

Secondly, a build system is needed.

Front Right - RODE NT-USB:

Obviously, we need to be able to compile a code to validate

Front Right - RODE NT-USB:

that it's syntactically correct.

Front Right - RODE NT-USB:

And then finally we need to test framework.

Front Right - RODE NT-USB:

Sometimes it's built into the language or natively supported.

Front Right - RODE NT-USB:

Sometimes you need to find a framework that you can use with your build system.

Front Right - RODE NT-USB:

Once you have these three things.

Front Right - RODE NT-USB:

That it makes sense to invest also in some automation that your tests show, you can

Front Right - RODE NT-USB:

run your test manually, but after every change, do you really want to do this?

Front Right - RODE NT-USB:

Perhaps sets up your CI to run tests every time you push.

Front Right - RODE NT-USB:

Also I'm currently working in a rust and with vs code has got a nice feature

Front Right - RODE NT-USB:

where you can just click on the test in the code and run it from the editor.

Front Right - RODE NT-USB:

Whatever we do, there has to be a low barrier to entry for testing.

Front Right - RODE NT-USB:

You want to be writing tests and running tests continuously as you code.

Front Right - RODE NT-USB:

Therefore it needs to be simple and as automated as possible.

Front Right - RODE NT-USB:

So there is some upfront work here to set up your project with a testing framework

Front Right - RODE NT-USB:

but this will pay you dividends when it comes to creating something new.

Front Right - RODE NT-USB:

When it comes to you creating your design.

Front Right - RODE NT-USB:

So perhaps in your source repository, you can even create a template

Front Right - RODE NT-USB:

project that is ready to go.

Front Right - RODE NT-USB:

Again, the barrier to entry, it needs to be really low.

Front Right - RODE NT-USB:

ideally, so that when you have the idea, when you want to try something out new,

Front Right - RODE NT-USB:

you can immediately create your projects and start designing, start creating.

Front Right - RODE NT-USB:

And this is the true power of TDD.

Front Right - RODE NT-USB:

Rather than agonizing over design and architecture and advance.

Front Right - RODE NT-USB:

You can just see what flows from your mind whilst constraining yourself to

Front Right - RODE NT-USB:

focus on one piece of functionality at a time, one aspect at a time.

Front Right - RODE NT-USB:

Right a test.

Front Right - RODE NT-USB:

Write the code.

Front Right - RODE NT-USB:

Refactor.

Front Right - RODE NT-USB:

Red green refactor and then green again.

Front Right - RODE NT-USB:

Piece by piece.

Front Right - RODE NT-USB:

You will create something that not only more closely resembles

Front Right - RODE NT-USB:

what you intended to build.

Front Right - RODE NT-USB:

But also has a great code coverage already built in.

Front Right - RODE NT-USB:

For me, TDD is an absolute, no brainer.

Front Right - RODE NT-USB:

If you've not tried it yet.

Front Right - RODE NT-USB:

Then what are you waiting for?

Front Right - RODE NT-USB:

That's it for this week.

Front Right - RODE NT-USB:

Nice and short and sharp.

Front Right - RODE NT-USB:

I'm in the middle of writing something fun using TDD.

Front Right - RODE NT-USB:

So I need to get back to it.

Front Right - RODE NT-USB:

I wish you luck check out the book until next time.

Front Right - RODE NT-USB:

Goodbye.