Test-Driven Development¶
The TDD Cycle¶
- Red: Write a failing test
- Green: Write minimal code to pass
- Refactor: Improve code while keeping tests green
Workflows¶
- [ ] Write Test: Write a test that describes desired behavior
- [ ] Run Test: Verify it fails (Red)
- [ ] Implement: Write minimal code to pass
- [ ] Run Test: Verify it passes (Green)
- [ ] Refactor: Clean up while tests stay green
- [ ] Repeat: Next test case
TDD Example (Java + JUnit 5)¶
Step 1: Red - Write Failing Test¶
class CalculatorTest {
@Test
void add_TwoNumbers_ReturnsSum() {
// Arrange
Calculator calc = new Calculator();
// Act
int result = calc.add(2, 3);
// Assert
assertThat(result).isEqualTo(5);
}
}
// Run: mvn test
// FAIL - Cannot resolve symbol 'Calculator'
Step 2: Green - Minimal Implementation¶
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
// Run: mvn test
// PASS ✓
Step 3: Refactor (if needed)¶
Code is already clean, move to next test.
Step 4: Next Test¶
@Test
void subtract_TwoNumbers_ReturnsDifference() {
// Arrange
Calculator calc = new Calculator();
// Act
int result = calc.subtract(5, 3);
// Assert
assertThat(result).isEqualTo(2);
}
// Run: mvn test
// FAIL - Cannot resolve method 'subtract' in 'Calculator'
Step 5: Implement Subtract¶
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
}
// Run: mvn test
// PASS ✓ (2 tests passing)
TDD Benefits¶
- Design Feedback: Tests reveal design issues early
- Documentation: Tests document expected behavior
- Confidence: Refactor fearlessly with test safety net
- Focus: One behavior at a time
TDD Tips¶
- Start Simple: Begin with the simplest test case
- One Assert: Each test should verify one behavior
- Descriptive Names: Test names are documentation
- No Logic in Tests: Tests should be obvious
- Fast Feedback: Tests should run in milliseconds
When to Use TDD¶
- New features with clear requirements
- Bug fixes (write failing test first)
- Complex business logic
- API contract development
When TDD is Less Useful¶
- Exploratory/prototype code
- UI layout changes
- Simple CRUD operations