TDD 적용 범위
Test-Driven Development 적용 영역과 방법을 설명합니다.
개요
Multi-SaaS Kit은 Core 모듈과 비즈니스 로직에 TDD를 적용합니다. 테스트를 먼저 작성하고, 테스트를 통과하는 코드를 작성하는 방식으로 개발합니다.
┌────────────────────────────────────── ───────────────────────┐
│ TDD 사이클 │
│ │
│ ┌────────────────────────────────┐ │
│ │ │ │
│ ▼ │ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Red │────►│ Green │────►│Refactor │ │
│ │ (실패) │ │ (통과) │ │ (정리) │ │
│ └─────────┘ └─────────┘ └────┬────┘ │
│ │ │
│ └───────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
TDD 적용 영역
✅ TDD 필수 (MUST)
반드시 테스트를 먼저 작성해야 하는 영역입니다.
| 영역 | 이유 | 예시 |
|---|---|---|
| Core/Permission | 권한 오류 = 보안 사고 | UserLevel, HasLevel, Policy |
| Core/Tenant | 데이터 격리 = SaaS 핵심 | TenantScope, BelongsToTenant |
| Core/Audit | 감사 로그 무결성 | AuditLog, Auditable |
| 비즈니스 로직 | 계산, 상태 전이 | 구독, 결제, 제한 검사 |
| 보안 관련 | 인증, 인가 | Middleware, Policy, Guard |
// TDD 필수 영역 예시: 권한 검사
// 1. 먼저 테스트 작성
test('Tenant Admin은 자신의 테넌트 사용자만 관리할 수 있다', function () {
$tenantA = Tenant::factory()->create();
$tenantB = Tenant::factory()->create();
$adminA = User::factory()->create([
'tenant_id' => $tenantA->id,
'level' => 2, // Tenant Admin
]);
$userB = User::factory()->create([
'tenant_id' => $tenantB->id,
]);
$this->actingAs($adminA);
expect($adminA->canManageUser($userB))->toBeFalse();
});
// 2. 테스트 통과하는 코드 작성
public function canManageUser(User $target): bool
{
// 같은 테넌트인지 확인
if ($this->tenant_id !== $target->tenant_id) {
return false;
}
// 하위 레벨만 관리 가능
return $this->level < $target->level;
}
🔶 TDD 권장 (SHOULD)
테스트 작성을 권장하는 영역입니다.
| 영역 | 이유 | 예시 |
|---|---|---|
| Model 관계 | 데이터 무결성 | HasMany, BelongsTo |
| Service 클래스 | 로직 검증 | *Service.php |
| API 엔드포인트 | 계약 검증 | Controller, Resource |
| Seeder | 초기 데이터 검증 | CoreSeeder |
// TDD 권장 영역 예시: Service
test('SubscriptionService는 만료된 구독을 감지한다', function () {
$user = User::factory()->create();
$user->subscription()->create([
'expires_at' => now()->subDay(),
]);
$service = new SubscriptionService();
expect($service->isActive($user))->toBeFalse();
});
⚪ TDD 선택 (MAY)
복잡한 로직이 있을 때만 테스트를 작성합니다.
| 영역 | 언제 테스트 |
|---|---|
| Filament Resource | 복잡한 액션/필터 |
| View/Blade | 조건부 렌더링 로직 |
| 설정 파일 | 동적 설정 생성 |