/cc-e2e:kick-off — 테스트 한 번에 깔아주는 도우미#
| 항목 | 내용 |
|---|---|
| 실행 명령 | /cc-e2e:kick-off |
| 분류 | E2E 작성 |
| 난이도 | ●●● 높음 |
| MCP 서버 | flutter-skill, patrol |
한마디로#
새 기능을 다 만들고 나면, 그 기능을 검증할 테스트 3종 세트를 한 방에 깔아주는 명령입니다. 이사 들어온 새 집에 화재경보기, 가스경보기, 도난경보기를 한 번에 설치해 주는 것과 비슷해요.
누가·언제 쓰나요#
- 새 기능 구현을 막 끝낸 개발자가, 그 기능의 테스트를 한꺼번에 준비하고 싶을 때
- PR(코드 제출)을 올리기 전에 "테스트 3종이 모두 걸려 있는지" 확인하고 싶을 때
cc-bricks나feature:*명령으로 기능 뼈대를 만든 직후, 테스트 세팅을 자동으로 끝내고 싶을 때
무엇을 해주나요#
기능 이름 하나만 주면, 검증용 테스트 파일들을 자동으로 만들어 줍니다.
- Unit 테스트 — 작은 부품 하나하나가 제대로 동작하는지 확인하는 파일 (UseCase / BLoC / Repository)
-
BDD 테스트 — 사람이 읽을 수 있는 시나리오(
.feature)와, 실제 기기(Patrol) 검증 파일 틀을app/{app}/integration_test/에 마련합니다. ⛔ 코드 생성기를 쓰지 않고, 화면 단위(위젯) 검증 파일도 만들지 않습니다 — BDD 시나리오는 손으로 쓰는 Patrol E2E로만 실행됩니다. -
위젯 테스트 (필요시, BDD 와 무관) — feature 패키지 안에 통상적인 손으로 쓰는 위젯 테스트를 별도로 둘 수 있습니다.
.feature에서 파생되지 않습니다. - 마지막에 요약 리포트 — 만들어진 파일 개수, 아직 채워야 할 작업(TODO) 목록, 검증 통과 여부, 다음에 할 일 안내
.feature 시나리오가 아직 없으면, 앱을 직접 둘러보며 시나리오 초안까지 대신 만들어 줄 수도 있습니다.
어떻게 쓰나요#
# 기본 — 기능 폴더에서 알아서 감지
/cc-e2e:kick-off sign_in
# 시나리오(.feature)가 없을 때 만드는 방식 지정
/cc-e2e:kick-off sign_in --with-exploration # 앱을 둘러보며 시나리오 초안부터 만들기
/cc-e2e:kick-off sign_in --skeleton-only # 최소 뼈대 시나리오만 만들기
# 원하는 테스트 종류만 선택
/cc-e2e:kick-off sign_in --layers=unit,bdd # Unit + BDD 만
/cc-e2e:kick-off sign_in --layers=bdd # BDD 만
# 실제로 만들지 않고 계획만 미리보기
/cc-e2e:kick-off sign_in --dry-run
sign_in자리에는 테스트를 깔 기능 이름을 적습니다 (소문자_언더바 형식).- 옵션을 안 붙이면 기본으로 Unit + BDD 테스트를 만듭니다.
- 무엇이 만들어질지 먼저 확인하고 싶으면
--dry-run으로 계획만 볼 수 있어요.
안에서 무슨 일이 벌어지나요#
대략 다음 순서로 진행됩니다.
- 사전 조사 — 기능이 실제로 있는지, 이미 만들어진 테스트는 있는지, 손대면 안 되는(lock) 시나리오는 없는지 확인합니다.
- Unit 테스트 깔기 — 작은 부품별 테스트 파일(UseCase / BLoC / Repository)을 한꺼번에 만듭니다.
-
시나리오(.feature) 확보 —
app/{app}/integration_test/features/에 이미 있으면 그대로 쓰고, 없으면 옵션에 따라 앱을 둘러보며 만들거나 최소 뼈대만 만듭니다. -
BDD 테스트 깔기 —
app/{app}/integration_test/에 시나리오에 맞는 단계별 템플릿과, 손으로 채워 넣을 Patrol 테스트 틀을 마련합니다. 코드 생성기를 쓰지 않고, 화면 단위(위젯) 검증 파일도 만들지 않습니다. -
검증 —
/cc-dev:pr:preflight를 자동으로 돌려 방금 만든 테스트가 실제로 통과하는지 확인하고, 실패하면 원인을 정리해 PR 생성을 막아 줍니다. - 리포트 — 만든 파일 수, 남은 작업, 검증 결과, 다음 단계를 한눈에 정리해 보여줍니다.
⚙️ 상세 옵션·실행 명세 (개발자 / AI 에이전트용)
Triggers#
- 새 feature 구현 직후 테스트 번들을 준비할 때
- PR 올리기 전에 "테스트 3 레이어가 모두 걸려 있는지" 검증할 때
cc-bricks/cc-flutter:feature:*로 feature 만든 뒤 테스트 자동 세팅
사용법#
# 기본 — feature 디렉토리에서 자동 감지
/cc-e2e:kick-off sign_in
# .feature 생성 방법 명시
/cc-e2e:kick-off sign_in --with-exploration # flutter-skill 탐색부터
/cc-e2e:kick-off sign_in --skeleton-only # skeleton .feature 만 생성
# 특정 레이어만
/cc-e2e:kick-off sign_in --layers=unit,bdd # unit + BDD 만
/cc-e2e:kick-off sign_in --layers=bdd # BDD 만
# Dry run
/cc-e2e:kick-off sign_in --dry-run # 생성 계획만 출력파라미터#
| 파라미터 | 필수 | 설명 | 기본 |
|---|---|---|---|
feature | ✅ | feature 모듈 이름 (snake_case) | — |
--with-exploration | ❌ | .feature 없으면 /cc-e2e:explore 먼저 호출 | false |
--skeleton-only | ❌ | .feature 없으면 최소 skeleton 생성 (탐색 생략) | false |
--layers | ❌ | 생성 레이어 선택 (unit,bdd,e2e) | unit,bdd |
--dry-run | ❌ | 생성 계획만 출력 | false |
--device | ❌ | Patrol 검증용 디바이스 | 자동 감지 |
실행 단계#
- 사전 조사 — feature 모듈 존재 확인, 기존 테스트 파일 파악, lock 레코드 확인
- Unit 레이어 스캐폴드 (위임:
cc-flutter:unit-testing)- UseCase 테스트 파일 일괄 생성
- BLoC 테스트 파일 생성 (
blocTest) - Repository 테스트 파일 생성
.feature확보 (⛔ 항상app/{app}/integration_test/features/— feature 패키지 경유 없음)- 존재 → 그대로 사용
- 없고
--with-exploration→/cc-e2e:explore+/cc-e2e:draft - 없고
--skeleton-only→ 최소 skeleton 작성
- BDD 레이어 스캐폴드 (
app/{app}/integration_test/하나에만, 코드 생성기 없음)step/에 TestDriver step 파일 템플릿 (TODO 주석).feature의 Scenario 를Background기준으로 묶어 Patrol 테스트 틀 생성 (patrolTest + TODO — 사람이 step 호출을 채움)- 같은
Background3건 이상 →scenarios/{name}_{screen}_batch_test.dart(배치, 기본)step/the_{screen}_screen_is_reset.dart리셋 스텁 +helpers/screen_batch.dart러너
@isolated이거나 2건 이하 →scenarios/{name}_{scenario}_test.dart
- 같은
test_bundle.dart+run_all_scenarios.sh갱신 (배치는 파일 1개 = 항목 1개)
- 검증 —
/cc-dev:pr:preflight --scope={feature-packages}자동 호출- Unit + Widget(BDD 와 무관한 일반 위젯 테스트만, 변경된 feature 패키지 범위)
- Integration @smoke (조건부, BDD 시나리오 포함)
- 실패 시 원인 그룹화 + PR 생성 차단
- 리포트 — 생성 파일 수, TODO 남은 step, preflight 결과, 다음 단계 제안
실행 흐름 다이어그램#
/cc-e2e:kick-off sign_in
↓
[사전 조사]
├─ feature/common/auth/ 존재? ✅
├─ 기존 테스트? 일부 있음
└─ lock 레코드? 없음
↓
[Unit 레이어]
├─ UseCase: SignInUseCase → test/src/domain/usecase/sign_in_usecase_test.dart
├─ BLoC: SignInBloc → test/src/presentation/bloc/sign_in_bloc_test.dart
└─ Repository: AuthRepository → test/src/data/repository/auth_repository_test.dart
↓
[.feature 확보]
└─ 없음 + --with-exploration
→ /cc-e2e:explore sign_in → /cc-e2e:draft sign_in
↓
[BDD 레이어] (app/kobic/integration_test/ 하나에만, 코드 생성기 없음)
├─ features/sign_in.feature 확보 (Scenario 4건 — 같은 Background 3건 + @isolated 1건)
├─ step/ 템플릿 생성 (i_tap_the_sign_in_button.dart 등)
├─ step/the_sign_in_screen_is_reset.dart 리셋 스텁 (3항 의무 TODO)
├─ scenarios/sign_in_sign_in_form_batch_test.dart 틀 (배치 3건 — 도달 1회)
└─ scenarios/sign_in_successful_login_test.dart 틀 (@isolated — 인증 상태 변경)
↓
[검증] /cc-dev:pr:preflight --scope=feature_common_auth
├─ Unit → PASS (42/0)
├─ Widget → PASS (12/0, 일반 위젯 테스트만 — BDD 무관)
└─ Integration @smoke → SKIP (디바이스 없음 or 시나리오 미존재)
↓
[리포트]
├─ 생성 파일 9개
├─ TODO step 3개 (목록)
├─ Preflight: PASS (Unit+Widget)
└─ 다음 단계: step-implement 로 TODO 채우기 → /cc-e2e:lock → /cc-dev:pr:preflight --with-integration출력#
- Unit 테스트 파일들
app/{app}/integration_test/하나에 모인 BDD.feature+ step/ 템플릿(리셋 step 포함) + Patrol 배치·단독 테스트 틀 (⛔ widget 테스트 없음, 코드 생성기 없음)- test_bundle.dart 업데이트
- 생성 요약 리포트 + TODO 목록
실패 케이스#
| 원인 | 대응 |
|---|---|
| feature 모듈 없음 | cc-bricks 또는 cc-flutter:feature:* 안내 |
feature 패키지 안에 레거시 test/src/bdd/ 발견 | rules/bdd-test-patterns.md 마이그레이션 절차 안내 — 제거 후 Patrol scenarios/ 로 이관 |
--with-exploration 요청인데 앱 미기동 | flutter run --dart-define=ENABLE_FLUTTER_SKILL=true 명령 안내 |
| lock 된 시나리오 덮어쓰기 시도 | /e2e:unlock 필요 안내 |
| Patrol 검증 실패 | step-implement 로 TODO 채우기 권유 |
관련#
- skills/feature-test-bundle/SKILL.md — 실제 오케스트레이션 본체
- commands/explore.md —
.feature가 없을 때 ① EXPLORE 진입 - commands/draft.md — 저널 →
.feature초안 - commands/lock.md — 번들 완성 후 박제
cc-dev:pr:preflight— PR 올리기 전 자동 게이트 (본 커맨드가 마지막 단계로 호출)- 위임:
cc-flutter:unit-testing,cc-flutter:bdd-testing,cc-flutter:integration-testing - 조직 표준:
cc-flutter/rules/bdd-test-patterns.md - PR 정책:
cc-dev/rules/pr-preflight-policy.md