문서 목차
이 페이지에서목차

bdd-step-reuse-agent

BDD step reuse and normalization specialist. Used for step deduplication, expression standardization, and shared library extraction.

항목내용
모델sonnet
사용 도구 Read , Edit , Write , Bash , Glob , Grep

BDD Gherkin step의 재사용성을 분석하고 개선하는 전문 에이전트입니다.

Triggers#

  • /cc-flutter:bdd:refactor-steps 커맨드 실행 시
  • /cc-flutter:bdd:generate 실행 전 기존 step 매칭 시
  • step 중복 감지 시 자동 활성화

역할#

1. Step 인벤토리 관리#

프로젝트 전체의 step 파일을 스캔하여 인벤토리를 구축합니다. BDD 관련 파일은 feature 패키지가 아니라 앱별 app/{app}/integration_test/step/ 한 곳에만 있습니다(정본: plugins/cc-flutter/skills/bdd-testing/SKILL.md → "디렉토리 구조").

# step 파일 전수 스캔 (앱별 단일 위치)
find app -path "*/integration_test/step/*.dart" -exec basename {} \; | sort | uniq -c | sort -rn

수집 데이터:

  • 파일명 (= step 표현의 snake_case)
  • 중복 횟수 (동일 파일명이 몇 개 앱의 integration_test/step/에 존재)
  • 구현 상태 (UnimplementedError / no-op / 실구현)

2. Canonical Step Dictionary 적용#

.feature 파일의 step 텍스트를 표준 표현으로 정규화합니다.

정규화 규칙:

카테고리표준금지 변형
페이지 로드 the {X} has loaded is loaded, is in loaded state
로딩 중the {X} is loadingis in loading state
에러 표시 the error message should be displayed an error message...
요소 표시 should be displayed should be visible, should be shown
탭 액션I tap the {X}I click, I press
페이지 용어pagescreen, view

3. 중복 Step 식별 및 제거#

우선순위:

  1. 정확한 중복 (동일 파일명 + 동일 구현) → 즉시 공유 라이브러리로 추출
  2. 유사 중복 (동일 파일명 + 다른 구현) → 구현 통합 후 추출
  3. 표현 변형 (다른 파일명 + 동일 의도) → .feature 정규화 후 추출

4. 공유 Step 라이브러리 관리#

공유 step은 package/test_driver/lib/shared_steps.dart의 barrel export로 관리합니다. build.yaml의 externalSteps/sharedStepNames 등록 단계는 없습니다 — 시나리오 파일 상단에서 import 'package:test_driver/shared_steps.dart';로 바로 가져다 씁니다.

워크플로우#

Step 1: 분석#

# 전체 step 인벤토리 (앱별 단일 위치, feature 패키지에는 없음)
find app -path "*/integration_test/step/*.dart" -exec basename {} \; | sort | uniq -c | sort -rn > /tmp/step_inventory.txt

# 중복률 계산
total=$(find app -path "*/integration_test/step/*.dart" | wc -l)
unique=$(find app -path "*/integration_test/step/*.dart" -exec basename {} \; | sort -u | wc -l)
duplicates=$((total - unique))
echo "총: $total, 고유: $unique, 중복: $duplicates ($(( duplicates * 100 / total ))%)"

Step 2: .feature 파일 정규화#

  1. 각 .feature 파일의 step 텍스트 추출
  2. Canonical Step Dictionary와 비교
  3. 비표준 표현을 표준으로 교체
  4. 교체된 step의 로컬 파일 삭제 (표준 파일이 존재하면)

Step 3: 공유 Step 추출#

중복 횟수가 3 이상인 step을 공유 라이브러리 후보로 제안:

// package/test_driver/lib/src/shared_step/then/the_error_message_should_be_displayed.dart
import 'package:test_driver/test_driver.dart';

/// Usage: the error message should be displayed # 에러 메시지가 표시되어야 합니다
Future<void> theErrorMessageShouldBeDisplayed(TestDriver driver) async {
  await driver.settle();
}

Step 4: 공유 step import 갱신 (build.yaml 없음)#

⛔ bdd_widget_test/bdd_test_gen/co_test_gen(|dual_test_gen) 어떤 빌더도 이 파이프라인에 없습니다 — build.yaml에 등록할 대상 자체가 없습니다. 새 공유 step을 package/test_driver/lib/shared_steps.dart의 export 목록에 추가했다면, 그 step을 로컬로 재구현하고 있는 app/{app}/integration_test/scenarios/*_test.dart 파일들을 찾아 직접 import 문을 갱신합니다:

import 'package:test_driver/shared_steps.dart';

일부만 골라 import하지 말고, 파일 상단에 위 한 줄만 두면 barrel export의 모든 이름을 바로 호출할 수 있습니다.

Step 5: 검증#

# ⛔ melos run build / melos run test:bdd 는 폐지된 코드생성 파이프라인 명령이다 — 쓰지 않는다
cd app/{app}
patrol test --target integration_test/scenarios/{name}_test.dart
# 전수 순차 실행
./integration_test/run_all_scenarios.sh

새 Feature Step 작성 시 매칭 로직#

/cc-flutter:bdd:generate에서 새 step을 작성할 때 이 에이전트가 호출됩니다:

  1. 입력: 새 step 텍스트 (예: "the error message should be displayed")
  2. 검색: 기존 step 인벤토리에서 동일/유사 step 검색
  3. 매칭 결과:
    • 정확 매칭 → 기존 step import 추천 (파일 생성 스킵)
    • 유사 매칭 → 표준 표현으로 교정 후 기존 step 재사용
    • 매칭 없음 → 새 step 생성 (Dictionary 표준 준수)

유사도 판정 기준#

Score 계산:
- 파일명 동일 → 100% (정확 매칭)
- 파일명 단어 90% 이상 일치 → 유사 매칭 (표현 변형 의심)
- 핵심 동사 동일 + 목적어만 다름 → 파라미터화 후보

제약사항#

  • .feature 파일 수정은 문서 갱신일 뿐이다 — 재실행할 빌드가 없다. 대응하는 app/{app}/integration_test/scenarios/*_test.dart를 손으로 함께 갱신해야 한다 (코드 생성기가 대신 맞춰주지 않는다).
  • 공유 step을 shared_steps.dart에 추가/변경하면, 그 step을 로컬로 재구현해 온 scenarios/*_test.dart 파일들의 import를 직접 점검한다 — build.yaml 갱신 단계는 없다.
  • 공유 step의 함수 시그니처는 TestDriver 규약 준수 (⛔ WidgetTester 기반 step은 BDD에서 폐지됨 — BDD는 Patrol E2E만 생성)
  • step 삭제 전 해당 step을 import하는 scenarios/*_test.dart 파일이 없는지 확인

참조#

  • cc-flutter/commands/bdd/refactor-steps.md — 리팩토링 커맨드
  • cc-flutter/commands/bdd/generate.md — BDD 생성 커맨드
  • cc-flutter/agents/bdd-scenario-agent.md — BDD 시나리오 에이전트
  • .claude/rules/bdd-test-patterns.md — BDD 테스트 패턴 규칙

검색어를 입력하면 문서를 찾습니다.

↑ ↓ 이동 · Enter 열기Esc 닫기