TDD

Valeriy Kuzmin, Lilt, 2020

What it is

Write a failing test

Fix it

Refactor

Key parts

  • Failing test is important
  • You must focus on code being testable

Some testing theory

  • Identifying dependencies
  • Picking equivalence classes
  • Multiplying factors
  • Focusing on determinism
  • Pruning the outcome
  • Prioritizing all above

(fake) arguments against

  • This takes too much time!
  • That is useless!
  • I am going to miss something anyway
  • But we'd have to support that
  • I'll write tests later
  • I'll delegate it to a QA engineer

(true) arguments against

  • Developers need to be trained
  • Legacy code is genuinely hard to test
  • Not all code is truly predictable
  • Sometimes you have to urgently refactor

So, how to apply?

  • Be positive, believe in yourself, work on the habit
  • Gradually introduce coverage for existing code when working on bugs
  • Write new code in TDD. If you cannot, write X% of new code in TDD
  • Integrate into CI (git hooks are not CI!)
  • Focus on low-level testing first
  • Improve and maintain the system

Recap

Benefits Costs
No way to cheat Need to allocate more time *
Improve code quality and design Need to care about CI *
Less regressions * Need to train developers *
Better test coverage
More skilled developers *
Better predictability of work
Less need for dedicated QA *
Less integrations broken
Happier developers!

Compared to no tests (*) or tests after, tests-first have...

But why? Isn't it just a theory?

Thanks!

Questions?

tdd-at-lilt

By Valeriy Kuzmin

tdd-at-lilt

  • 279