Testcontainers
Setup
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15")
.withDatabaseName("test")
.withUsername("test")
.withPassword("test");
Supported Services
| Service | Image |
|---|---|
| PostgreSQL | postgres:15 |
| MySQL | mysql:8 |
| Redis | redis:7 |
| Kafka | confluentinc/cp-kafka |
| MongoDB | mongo:6 |
Key Points
- Understanding Testcontainers is essential for production systems
- Always consider scalability and maintainability
- Test thoroughly before deploying to production
- Monitor performance and set up alerting
Common Patterns
- Validation: Always validate input at the boundary
- Error Handling: Use structured error responses
- Logging: Log key events for debugging
- Testing: Unit, integration, and load tests
- Documentation: Keep docs updated with code changes
Testing Strategies
Testing Pyramid
/ E2E \
/----------\
/ Integration \
/----------------\
/ Unit \
/--------------------
Test Types
- Unit: Individual components
- Integration: Component interactions
- E2E: Full user workflows
- Performance: Load/stress testing
Best Practices
- Write tests first (TDD)
- Aim for 80% coverage
- Test edge cases
- Keep tests fast and isolated
Key Points
- Understanding Testcontainers is essential for production systems
- Always consider scalability and maintainability
- Test thoroughly before deploying to production
- Monitor performance and set up alerting
Common Patterns
- Validation: Always validate input at the boundary
- Error Handling: Use structured error responses
- Logging: Log key events for debugging
- Testing: Unit, integration, and load tests
- Documentation: Keep docs updated with code changes
Practice Problems
Design and implement a solution for Testcontainers in a backend system. Consider scalability, error handling, and production readiness.
Solution
// Testcontainers implementation
// Key aspects: validation, error handling, logging, testing
public class Testcontainers {
// Production-ready implementation
} Identify and handle edge cases for Testcontainers. What happens under high load, with invalid input, or during failures?
Solution
// Edge case handling:
// 1. Null/empty input -> validation
// 2. High load -> rate limiting, queuing
// 3. Failures -> retries, circuit breaker
// 4. Concurrent access -> locks, idempotency Write a testing strategy for Testcontainers. Include unit tests, integration tests, and performance tests.
Solution
// Test plan:
// - Unit: 80% coverage target
// - Integration: API contracts
// - Performance: latency, throughput
// - Chaos: failure injection Quiz
1. Testcontainers runs?
2. @Container manages?
3. What is a common mistake when implementing Testcontainers?
Flashcards
Question
Testcontainers?
Click to reveal answer
Answer
Real services in Docker for testing
Question
@Container manages?
Click to reveal answer
Answer
Full lifecycle: create, start, stop
Question
Testcontainers best practices
Click to reveal answer
Answer
Follow SOLID principles, write clean code, test thoroughly, document decisions, and monitor in production.
Revision Notes
Key Takeaways
- 1. Testcontainers: real services in Docker
- 2. @Container manages lifecycle
- 3. @DynamicPropertySource for Spring config
- 4. Supports: PostgreSQL, MySQL, Redis, Kafka, MongoDB
Interview Tips
- • Use Testcontainers
- • Configure containers
Cheat Sheet
Testcontainers
- Real services in Docker
- @Container: lifecycle management
- @DynamicPropertySource: Spring config
- Supports: Postgres, MySQL, Redis, Kafka