# {프로젝트명} — QA 테스트 전략

> **버전**: v1
> **작성일**: {날짜}
> **담당**: 개발팀장
> **적용 범위**: {프로젝트명} 전 테스트 계층

---

## 1. 테스트 레이어

### 1.1 Unit Test — EditMode

> NerdNavis.Framework 자체 테스트와 동일 패턴 적용.

| 대상 | 예시 | 실행 모드 |
|------|------|----------|
| `ServiceLocator` | Register/Resolve/Clear 동작 | EditMode |
| `Log` | 카테고리 필터링, 로그 레벨 분기 | EditMode |
| DataTable 파싱 | JSON 역직렬화, null/범위 검증 | EditMode |
| 순수 C# 비즈니스 로직 | 대미지 계산 공식, 확률 계산 | EditMode |

```csharp
// EditMode 테스트 예시
[TestFixture]
public class ServiceLocatorTests
{
    [SetUp]
    public void SetUp() => ServiceLocator.Clear();

    [Test]
    public void Register_And_Resolve_ReturnsCorrectService()
    {
        var mock = new MockSaveProvider();
        ServiceLocator.Register<ISaveProvider>(mock);

        var resolved = ServiceLocator.Resolve<ISaveProvider>();

        Assert.AreEqual(mock, resolved);
    }
}
```

### 1.2 Unit Test — PlayMode

| 대상 | 예시 | 실행 모드 |
|------|------|----------|
| `MonoSingleton<T>` | Instance 생성, Persistent 동작 | PlayMode |
| `CoroutineRunner` | Start/Stop, 키 중복 방지 | PlayMode |
| UI View 전환 | UIManager Push/Pop 동작 | PlayMode |
| 씬 로딩 | Bootstrap → Title 씬 전환 | PlayMode |

### 1.3 Integration Test

| 대상 | 내용 |
|------|------|
| DataTable 전체 로딩 | Bootstrap 씬 진입 → TableChecker.AllLoaded 확인 |
| 서버 연동 E2E | 로그인 → 데이터 로딩 → 저장 → 재로그인 후 복원 |
| 핵심 게임 루프 | {장르} 핵심 액션 1회 플레이 성공 (크래시·콘솔 에러 없음) |

### 1.4 Data Validation

DataTable의 무결성을 Export 시 + 런타임(개발 빌드) 에서 이중 검증한다.

```csharp
// 04_데이터_파이프라인 섹션 5 참조
#if DEVELOPMENT_BUILD || UNITY_EDITOR
DataValidator.ValidateAll(); // FK 정합성, null, 범위
#endif
```

### 1.5 Manual QA

수동 QA는 5축 체크리스트(섹션 3)에 따라 수행한다.
자동화 범위를 초과하는 UX 검증·디바이스 다양성·성능 체감은 수동 QA 영역이다.

---

## 2. 테스트 네이밍

> NerdNavis.Framework 테스트와 동일한 패턴 적용.

```
{Method}_{Condition}_{Expected}
```

| 구성 | 설명 | 예시 |
|------|------|------|
| `{Method}` | 테스트 대상 메서드/동작 | `TakeDamage` |
| `{Condition}` | 입력 조건 | `WithMaxShield` |
| `{Expected}` | 기대 결과 | `ReducesShieldFirst` |

**전체 예시**:
```csharp
[Test] public void TakeDamage_WithMaxShield_ReducesShieldFirst() { }
[Test] public void TakeDamage_WhenHpIsZero_TriggersDeathEvent() { }
[Test] public void GetOrNull_WithUnknownId_ReturnsNull() { }
[Test] public void ServiceLocator_Resolve_WhenNotRegistered_ThrowsException() { }
```

---

## 3. QA 체크리스트 프레임 (5축)

각 기능 머지 전 해당 5축 중 적용 항목을 확인한다 (P14 QA 게이트).

### 3.1 기능(Functional)

- [ ] 핵심 게임 루프 정상 동작 ({장르} 핵심 액션)
- [ ] DataTable 로딩 완료 후 진행 (TableChecker.AllLoaded)
- [ ] UI 전환 정상 동작 (화면맵 경로별)
- [ ] 저장/로드 복원 일치
- [ ] 서버 인증 정상 처리
- [ ] 엣지 케이스: 재화 0, 최대치, 연속 탭 등

### 3.2 성능(Performance)

- [ ] 초기 로딩 체감 (Bootstrap → 첫 플레이 가능 시점)
- [ ] 인게임 FPS 안정성 (목표 프레임 유지)
- [ ] 메모리 증가 없음 (Profiler 확인)
- [ ] GC Alloc 핫패스 없음 (Profiler Deep Profile)

### 3.3 메모리(Memory)

- [ ] 씬 전환 시 메모리 해제 확인 (Addressables Release)
- [ ] 장시간 플레이 메모리 누수 없음
- [ ] TextAsset 언로드 확인 (DataTable Awake 패턴)

### 3.4 네트워크(Network)

- [ ] 오프라인 상태 진입 처리 (에러 메시지 + 복구 흐름)
- [ ] 느린 네트워크(3G 상당) 타임아웃 처리
- [ ] 재연결 후 상태 복원
- [ ] IAP 영수증 서버 검증 정상 처리 (해당 프로젝트)

### 3.5 보안(Security)

- [ ] 빌드에 하드코딩 키 없음 (`02_기술스택_결정 섹션 3.2`)
- [ ] IAP 클라이언트 단독 결제 처리 경로 없음
- [ ] SpeedHack/TimeCheck Detector 동작 확인 (해당 프로젝트)
- [ ] 개발용 씬/치트 코드 릴리스 빌드에서 제거 확인

---

## 4. 자동화 범위

### 4.1 Framework 테스트 (기구현)

NerdNavis.Framework 패키지에 포함된 테스트. 프로젝트 도입 시 자동으로 사용 가능.

| 영역 | 테스트 유형 | 위치 |
|------|-----------|------|
| `MonoSingleton<T>` | PlayMode | `NerdNavis.Framework.Tests` |
| `ServiceLocator` | EditMode | `NerdNavis.Framework.Tests` |
| `CoroutineRunner` | PlayMode | `NerdNavis.Framework.Tests` |
| `EventBus` | EditMode | `NerdNavis.Framework.Tests` |
| `Log` | EditMode | `NerdNavis.Framework.Tests` |
| `DataTable` 파싱 | EditMode | `NerdNavis.Framework.Tests` |

### 4.2 프로젝트 테스트 (프로젝트에서 추가)

| asmdef | 위치 | 내용 |
|--------|------|------|
| `{ProjectNamespace}.Tests` | `Assets/Tests/Runtime/` | PlayMode 통합 테스트 |
| `{ProjectNamespace}.EditorTests` | `Assets/Tests/Editor/` | EditMode 단위 테스트 |

**asmdef 설정 예시**:
```json
// {ProjectNamespace}.Tests.asmdef
{
    "name": "{ProjectNamespace}.Tests",
    "references": [
        "NerdNavis.Framework.Tests",
        "{ProjectNamespace}.Core",
        "UnityEngine.TestRunner",
        "UnityEditor.TestRunner"
    ],
    "includePlatforms": [],
    "excludePlatforms": [],
    "allowUnsafeCode": false,
    "testPlatforms": ["PlayMode"]
}
```

### 4.3 CI 자동화 실행 (해당 시)

```
Git push → CI 트리거
    └── Unity Test Runner (EditMode + PlayMode)
    └── 결과 리포트 → 실패 시 머지 차단
```

---

## 5. 버그 관리

| 심각도 | 기준 | 처리 |
|--------|------|------|
| **P0 Critical** | 크래시, 결제 실패, 데이터 손실 | 즉시 수정 (C2 근원 해결) |
| **P1 High** | 핵심 기능 불가, 보안 이슈 | 현 개발 단계 완료 전 수정 |
| **P2 Medium** | 기능 이상, 표시 오류 | 다음 개발 단계 전 수정 |
| **P3 Low** | 미관, 텍스트 오탈자 | 여유 시 수정 |

**규칙**: P14에 따라 Unity 빌드 에러·콘솔 에러 잔존 상태로 작업 종료 금지.
버그 수정 시 동일 경로의 회귀 검증 포함.

---

## 변경 이력

| 버전 | 일자 | 작성자 | 내용 |
|------|------|--------|------|
| v1 | {날짜} | 개발팀장 | 템플릿 초안. Framework 테스트 패턴 + 5축 QA 체크리스트 정립 |
