5.6 KiB
5.6 KiB
Testing Checklist
Use this checklist before submitting PRs to ensure comprehensive test coverage and quality.
Pre-PR Testing Checklist
Test Coverage
- All new functions/methods have unit tests
- All new components have component tests
- All new API endpoints have integration tests
- Critical user flows have E2E tests
- Code coverage is at least 80% (run
bun test --coverageorpytest --cov) - No coverage regression from previous version
- Security-critical code has 100% coverage (auth, payments, tenant isolation)
Test Quality
- Tests follow naming convention:
test_should_do_something_when_condition - Each test has a single, clear assertion focus
- Tests are independent (can run in any order)
- Tests clean up after themselves (no database pollution)
- No hardcoded values (use constants or fixtures)
- Test data uses factories (faker/factory-boy)
- Mock external services (APIs, email, payments)
- Tests run in < 10 seconds (unit tests < 100ms each)
Test Markers
- Unit tests marked with
@pytest.mark.unitor intests/unit/ - Integration tests marked with
@pytest.mark.integrationor intests/integration/ - E2E tests marked with
@pytest.mark.e2eor intests/e2e/ - Slow tests marked with
@pytest.mark.slow(> 5 seconds)
Multi-Tenant Testing
- All database queries test tenant isolation
- Repository methods verify correct
tenant_idfiltering - API endpoints test tenant header validation
- Cross-tenant access attempts are tested and fail correctly
Environment Variables
- All tests use Doppler for environment variables
- No hardcoded secrets or API keys
- Test database is separate from development database
.envfiles are NOT committed to repository- CI uses
DOPPLER_TOKEN_TESTsecret
Error Handling
- Tests verify error messages and status codes
- Edge cases are tested (null, empty, invalid input)
- Validation errors return correct HTTP status (422)
- Database errors are handled gracefully
- Tests verify rollback on transaction errors
TypeScript Specific
- React Testing Library used for component tests
- TanStack Query components tested with QueryClientProvider wrapper
- Server function mocks use
vi.mock() - Async components use
waitFor()for assertions - Vitest globals enabled in config (
globals: true)
Python Specific
- Virtual environment activated before running tests
- Async fixtures used for async code (
async def) - FastAPI TestClient used for API tests
- Database fixtures use session-scoped engine
- SQLAlchemy sessions auto-rollback in fixtures
CI/CD
- Tests pass locally with
bun testordoppler run -- pytest - Tests pass in CI (GitHub Actions)
- Coverage report uploaded to Codecov
- No test warnings or deprecation messages
- Pre-commit hooks pass (if configured)
Test Types Checklist
Unit Tests
- Test single function/class in isolation
- Mock all external dependencies
- No database or network calls
- Fast execution (< 100ms per test)
- Cover all code branches (if/else, try/catch)
Integration Tests
- Test multiple components together
- Use real database (with cleanup)
- Test complete API request/response cycles
- Verify database state changes
- Test transaction handling
E2E Tests
- Test complete user workflows
- Use Playwright for TypeScript
- Test from user perspective (UI interactions)
- Verify multi-step processes
- Test critical business flows
Benchmark Tests
- Measure performance metrics
- Set performance thresholds
- Test with realistic data volumes
- Monitor for regressions
Coverage Goals by Component
Utility Functions
- 95%+ coverage
- All branches tested
- Edge cases handled
Business Logic (Services)
- 90%+ coverage
- All business rules tested
- Error scenarios covered
API Endpoints
- 85%+ coverage
- All HTTP methods tested
- All response codes verified
Database Repositories
- 90%+ coverage
- CRUD operations tested
- Tenant isolation verified
React Components
- 80%+ coverage
- Rendering tested
- User interactions tested
- Loading/error states tested
Security Features
- 100% coverage
- Authentication tested
- Authorization tested
- Tenant isolation verified
Common Testing Mistakes to Avoid
Don't
- ❌ Test implementation details
- ❌ Test private methods directly
- ❌ Write tests that depend on execution order
- ❌ Use real external services in tests
- ❌ Hardcode test data
- ❌ Commit
.envfiles - ❌ Skip test cleanup
- ❌ Test multiple things in one test
- ❌ Forget to await async operations
- ❌ Mock too much (integration tests)
Do
- ✅ Test public APIs and behaviors
- ✅ Write independent, isolated tests
- ✅ Mock external services
- ✅ Use test factories for data
- ✅ Use Doppler for environment variables
- ✅ Clean up test data
- ✅ Focus each test on one assertion
- ✅ Use
waitFor()for async rendering - ✅ Test error scenarios
- ✅ Verify tenant isolation
Post-Testing Checklist
- All tests pass locally
- Coverage meets minimum threshold (80%)
- No failing tests in CI
- Coverage report reviewed
- Test output reviewed for warnings
- Performance acceptable (no slow tests)
- Documentation updated (if test patterns changed)
- Reviewers can understand test intent