LogoSkills

bdd-scenario-agent

BDD scenario generation specialist. Used for Gherkin syntax and step definition writing

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/bdd:generate
Aliases/bdd:scenario, /test:bdd
ToolsRead, Edit, Write, Glob, Grep
Modelsonnet
Skillsbdd

/bdd:generate โ€” ํ™”๋ฉด ์‹œ๋‚˜๋ฆฌ์˜ค ์ž๋™ ์ž‘์„ฑ๊ธฐ#

ํ•œ๋งˆ๋””๋กœ#

์ƒˆ ํ™”๋ฉด์„ ๋งŒ๋“ค ๋•Œ "์ด ํ™”๋ฉด์ด ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค"๋Š” ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž๋™์œผ๋กœ ์จ์ฃผ๋Š” ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ์‹ ์ž… ์ง์›์—๊ฒŒ "์ด ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ์ด๋ ‡๊ฒŒ ๋˜๊ณ , ๋นˆ์นธ์ด๋ฉด ์ด๋Ÿฐ ๊ฒฝ๊ณ ๊ฐ€ ๋– ์•ผ ํ•œ๋‹ค"๋Š” ์—…๋ฌด ๋งค๋‰ด์–ผ์„ ๋Œ€์‹  ์ •๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”.

๋ˆ„๊ฐ€ยท์–ธ์ œ ์“ฐ๋‚˜์š”#

  • ๋ชฉ๋กยท์ƒ์„ธยท์ž…๋ ฅ ํผ ๊ฐ™์€ ์ƒˆ ํ™”๋ฉด์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์ง์ „, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€ ํ•ฉ์˜๋œ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ํ•„์š”ํ•  ๋•Œ
  • /bdd:generate ๋ช…๋ น์„ ์ง์ ‘ ์‹คํ–‰ํ–ˆ์„ ๋•Œ
  • ํ”ผ๊ทธ๋งˆ ๋ถ„์„(/figma:analyze) ํ๋ฆ„์—์„œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋  ๋•Œ

๋ฌด์—‡์„ ํ•ด์ฃผ๋‚˜์š”#

ํ™”๋ฉด ์ข…๋ฅ˜(๋ชฉ๋ก / ์ƒ์„ธ / ์ž…๋ ฅ ํผ)์— ๋งž๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฌธ์„œ์™€ ๊ทธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‹ค์ œ๋กœ ๊ฒ€์ฆํ•˜๋Š” ์ฝ”๋“œ ๋ฌถ์Œ์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ƒ๊ธฐ๋Š” ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • {feature}_list.feature, {feature}_detail.feature, {feature}_form.feature โ€” ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” "๋™์ž‘ ์‹œ๋‚˜๋ฆฌ์˜ค" ๋ฌธ์„œ (Gherkin ํ˜•์‹)
  • step/ ํด๋”์˜ *_steps.dart ํŒŒ์ผ๋“ค โ€” ๊ฐ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฌธ์žฅ์„ ์‹ค์ œ๋กœ ๊ฒ€์ฆํ•˜๋Š” ์ฝ”๋“œ
  • hooks/hooks.dart โ€” ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๊ฐ€์งœ ๋ฐ์ดํ„ฐ(Mock) ์ค€๋น„ ์ฝ”๋“œ

๊ฐ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฌธ์žฅ์€ ์˜์–ด ์›๋ฌธ + # ํ•œ๊ธ€ ๋ฒˆ์—ญ ์ฃผ์„์„ ๋‚˜๋ž€ํžˆ ์ ์–ด, ๊ฐœ๋ฐœ์ž์™€ ๋น„๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ๊ป˜ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์“ฐ๋‚˜์š”#

# ๊ธฐ๋ณธ: ๊ธฐ๋Šฅ ์ด๋ฆ„๊ณผ ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„์„ ๋„˜๊น๋‹ˆ๋‹ค
/bdd:generate

# ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด์š” (๋ณ„์นญ)
/bdd:scenario
/test:bdd

๋„˜๊ธฐ๋Š” ์ •๋ณด:

  • feature_name (ํ•„์ˆ˜) โ€” ๊ธฐ๋Šฅ ๋ชจ๋“ˆ ์ด๋ฆ„ (์˜ˆ: community_post)
  • entity_name (ํ•„์ˆ˜) โ€” ๋ฐ์ดํ„ฐ ์ด๋ฆ„ (์˜ˆ: CommunityPost)
  • screen_type (์„ ํƒ) โ€” list(๋ชฉ๋ก) / detail(์ƒ์„ธ) / form(์ž…๋ ฅ ํผ)

์•ˆ์—์„œ ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์ง€๋‚˜์š”#

ํ™”๋ฉด ์ข…๋ฅ˜๋ฅผ ํŒ๋‹จํ•œ ๋’ค, ์ข…๋ฅ˜๋ณ„๋กœ ํ”ํžˆ ํ•„์š”ํ•œ ๋™์ž‘๋“ค์„ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ํ’€์–ด๋ƒ…๋‹ˆ๋‹ค.

  1. ๋ชฉ๋ก ํ™”๋ฉด โ€” ๋ชฉ๋ก ๋ถˆ๋Ÿฌ์˜ค๊ธฐ, ๋‹น๊ฒจ์„œ ์ƒˆ๋กœ๊ณ ์นจ, ๋ฌดํ•œ ์Šคํฌ๋กค, ์นด๋“œ ํƒญ ์‹œ ์ƒ์„ธ ์ด๋™, ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ, ๋น„์–ด ์žˆ์Œยท์˜ค๋ฅ˜ ์ƒํƒœ
  2. ์ƒ์„ธ ํ™”๋ฉด โ€” ์ƒ์„ธ ์ •๋ณด ํ‘œ์‹œ, ์ข‹์•„์š” ํ† ๊ธ€, (์ž‘์„ฑ์ž๋งŒ) ์ˆ˜์ •ยท์‚ญ์ œ, ๊ณต์œ 
  3. ์ž…๋ ฅ ํผ ํ™”๋ฉด โ€” ์ •์ƒ ์ œ์ถœ, ํ•„์ˆ˜ ํ•ญ๋ชฉ ๋ˆ„๋ฝ ๊ฒฝ๊ณ , ๊ธ€์ž ์ˆ˜ ์ œํ•œ, ์ด๋ฏธ์ง€ ์ฒจ๋ถ€ยท์‚ญ์ œ, ์ž‘์„ฑ ์ทจ์†Œ, ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜
  4. ํ’ˆ์งˆ ์ ๊ฒ€ โ€” ๋ชจ๋“  ๋ฌธ์žฅ์— ํ•œ๊ธ€ ๋ฒˆ์—ญ ์ฃผ์„์ด ๋ถ™์—ˆ๋Š”์ง€, ๊ณต์šฉ ์Šคํ…์„ ์žฌ์‚ฌ์šฉํ–ˆ๋Š”์ง€, @smokeยท@validation ๊ฐ™์€ ๋ถ„๋ฅ˜ ํƒœ๊ทธ๋ฅผ ๋‹ฌ์•˜๋Š”์ง€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

โš™๏ธ ์ƒ์„ธ ์˜ต์…˜ยท์‹คํ–‰ ๋ช…์„ธ (๊ฐœ๋ฐœ์ž / AI ์—์ด์ „ํŠธ์šฉ)

Role#

Analyzes screen types (list/detail/form) and generates Gherkin scenarios and Step definitions.


Activation Conditions#

  • /bdd:generate Activated when command is invoked
  • /figma:analyze Invoked from orchestration

Parameters#

ParameterRequiredDescription
feature_nameโœ…Feature module name (snake_case)
entity_nameโœ…Entity name (PascalCase)
screen_typeโŒlist, detail, form

Generated Files#

feature/{location}/{feature_name}/test/src/bdd/
โ”œโ”€โ”€ {feature}_list.feature
โ”œโ”€โ”€ {feature}_detail.feature
โ”œโ”€โ”€ {feature}_form.feature
โ”œโ”€โ”€ step/
โ”‚   โ”œโ”€โ”€ common_steps.dart          # package/core์—์„œ import
โ”‚   โ”œโ”€โ”€ {feature}_list_steps.dart
โ”‚   โ”œโ”€โ”€ {feature}_detail_steps.dart
โ”‚   โ””โ”€โ”€ {feature}_form_steps.dart
โ””โ”€โ”€ hooks/
    โ””โ”€โ”€ hooks.dart

Core Patterns Summary#

Gherkin Rules#

  • Feature/Scenario title: Write in English with # ํ•œ๊ธ€ ๋ฒˆ์—ญ comment (e.g., Feature: Login Page # ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€)
  • Scenario description: Write in English with # ํ•œ๊ธ€ ๋ฒˆ์—ญ comment
  • Step pattern: English required with # ํ•œ๊ธ€ ๋ฒˆ์—ญ comment (e.g., Given I am on the login page # ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค)
  • Korean text as parameters: {'ํ•œ๊ธ€Value'} Format

Step Definition Rules#

  • Function name: English camelCase (iTapTheButton)
  • Usage ์ฃผ์„ ๋ณ‘๊ธฐ: /// Usage: When I tap button + /// ์šฉ๋„: ๋ฒ„ํŠผ์„ ํƒญํ•ฉ๋‹ˆ๋‹ค
  • ๊ณต์šฉ ์Šคํ… ์žฌUsage: package:core/src/test/bdd/bdd.dart

Tag System#

TagPurpose
@smokeCore functionality tests
@validationValidation checks
@navigationPage navigation
@errorError handling

Scenarios by Screen Type#

List Screen#

  • List loading, pull-to-refresh, infinite scroll
  • Card tap -> detail navigation, FAB -> create page
  • Category filter, error/empty states

Detail Screen#

  • Detail display, like toggle
  • Edit/delete (author only), share

Form Screen#

  • Valid form submission, missing required fields
  • Character limit, image attach/delete
  • Cancel writing, network error

Checklist#

  • Feature/Scenario title: English with # ํ•œ๊ธ€ ๋ฒˆ์—ญ comment
  • Step pattern: English with # ํ•œ๊ธ€ ๋ฒˆ์—ญ comment
  • Korean comment: # ํ•œ๊ธ€ ๋ฒˆ์—ญ after every content line (Feature, Scenario, description, steps)
  • Function name: English camelCase
  • Shared steps: reuse core/bdd.dart
  • Tags: apply @smoke, @validation, etc.
  • hooks.dart: Mock setup
  • build.yaml: bdd_widget_test setup
  • Multi-field forms (3+ fields): values in a Given data table, submitted via a single When domain step โ€” no one-When/And-per-field chains
  • Scenario Outline used only when the data variation itself is the thing under test โ€” regular Scenario otherwise