We can't find the internet
Attempting to reconnect
Something went wrong!
Hang in there while we get back on track
How to fall in love with TDD - Gui Ferreira - NDC Oslo 2024
Learn how Test-Driven Development builds confidence and speed over time. Discover key challenges, best practices, and mindset changes needed to fall in love with TDD.
-
TDD works like a flywheel - hard to start but builds momentum over time. Initial investment pays off as confidence and speed increase
-
Key challenges in TDD adoption:
- Writing tests first feels unnatural initially
- Maintaining test quality and avoiding fragile tests
- Choosing right test scope and avoiding overuse of mocks
- Keeping test execution time manageable
- Getting team buy-in and overcoming resistance
-
Focus on testing behaviors rather than implementation details:
- Test through public contracts/interfaces
- Avoid coupling tests to internal structure
- Allow internal refactoring without breaking tests
- Use real collaborators instead of mocks when possible
-
TDD Best Practices:
- Start with a test list to capture requirements and cases
- Take small steps, don’t try to solve everything at once
- Run tests frequently to catch issues early
- Refactor after getting tests to pass
- Keep test code clean and maintainable
-
Benefits of proper TDD:
- Reduced debugging time
- Better design through incremental development
- Documentation through tests
- Increased confidence in changes
- Faster feedback cycles
-
Testing Strategy:
- Unit test the core domain logic
- Integration test external boundaries
- Create stable contracts between components
- Use acceptance tests sparingly for critical flows
- Target 90%+ coverage but don’t make it the goal
-
Mindset changes needed:
- Think about design before implementation
- Embrace incremental development
- Accept initial productivity hit for long-term gains
- Focus on value of tests, not just coverage
- Have empathy for team members learning TDD
-
Tools and techniques:
- Use mutation testing to verify test quality
- Keep test execution time under 60 seconds
- Leverage architecture patterns that enable testing
- Write test lists before implementation
- Practice refactoring to keep code clean