빠른 흐름
csharp
using NUnit.Framework;
[Test]
public void AddScore_Increases_Total()
{
int score = 0;
score += 10;
Assert.AreEqual(10, score);
}기본 흐름
- Unity Test Framework는 "Unity에서도 테스트를 돌릴 수 있다"를 넘어서, 어떤 로직을
MonoBehaviour밖으로 밀어낼지 판단하게 해 주는 설계 도구이기도 합니다. EditMode테스트는 빠르고 순수 로직 검증에 잘 맞습니다. 데미지 계산, 인벤토리 규칙, 상태 전이, 저장 데이터 직렬화 같은 코드는 가급적 여기서 커버하는 편이 좋습니다.PlayMode테스트는 씬, 코루틴,MonoBehaviourlifecycle, 실제 활성화 흐름이 중요할 때 사용합니다. UI 전환, 씬 로딩, 프리팹 배치, 런타임 상호작용은 여기서 검증해야 현실성이 높습니다.- 좋은 Unity 테스트 전략은 모든 것을 PlayMode로 돌리는 것도, 모든 것을 순수 C#으로 우기는 것도 아닙니다. "핵심 규칙은 EditMode에서 빠르게", "엔진 통합은 PlayMode에서 선별적으로"가 가장 실전적입니다.
- 그래서 테스트 작성이 어렵다면 도구 문제가 아니라 설계 경고일 가능성이 큽니다. Unity 의존이 없는 로직은 별도 클래스로 빼고,
MonoBehaviour는 연결과 수명주기에 집중하게 만들면 테스트가 훨씬 쉬워집니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 계산·규칙·상태 전이 검증 | EditMode 테스트 (빠름) |
| 씬·lifecycle·코루틴 흐름 검증 | PlayMode 테스트 (느림, 선별적 사용) |
| 테스트 작성이 어렵고 복잡함 | 설계 경고 → MonoBehaviour에서 로직 분리 |
| 어디부터 시작할지 모름 | 자주 깨지는 규칙과 저장/역직렬화부터 |
주의할 점
테스트 수보다 실패했을 때 원인을 바로 좁힐 수 있느냐가 더 중요합니다. EditMode 테스트 없이 PlayMode만 쌓으면 느리고 디버깅도 어려워집니다.
csharp
// ❌ 모든 테스트를 PlayMode로 → 느리고 격리 어려움
[UnityTest]
public IEnumerator PlayerTakesDamage()
{
// 씬 로딩, 오브젝트 생성, 프레임 대기...
yield return new WaitForSeconds(1f);
Assert.AreEqual(90, player.hp);
}
// ✅ 규칙 로직은 EditMode → 빠르고 격리됨
[Test]
public void TakeDamage_ReducesHp()
{
var health = new HealthSystem(100);
health.TakeDamage(10);
Assert.AreEqual(90, health.Hp); // 0ms, 씬 불필요
}
// PlayMode는 엔진 통합이 꼭 필요한 경우에만
// 예: 씬 로딩, UI 전환, 코루틴 타이밍참고 링크
2 sources