LogoSkills

test-runner-agent

This agent verifies and runs tests for Features.

ํ•ญ๋ชฉ๋‚ด์šฉ
Modelsonnet

test-runner-agent โ€” ํ…Œ์ŠคํŠธ ์ž๋™ ๊ฒ€์‚ฌ๊ด€#

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

์ƒˆ ๊ธฐ๋Šฅ์„ PR๋กœ ์˜ฌ๋ฆฌ๊ธฐ ์ „์— "์ด๊ฑฐ ์ง„์งœ ์ž˜ ๋Œ์•„๊ฐ€๋‚˜?" ์ž๋™์œผ๋กœ ์ ๊ฒ€ํ•ด ์ฃผ๋Š” ํ’ˆ์งˆ ๊ฒ€์‚ฌ๊ด€์ž…๋‹ˆ๋‹ค. ๊ณต์žฅ์—์„œ ์ œํ’ˆ์„ ์ถœํ•˜ํ•˜๊ธฐ ์ „ ๋งˆ์ง€๋ง‰ ๊ฒ€์ˆ˜๋Œ€๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๊ฒ€์ˆ˜๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ถœํ•˜(PR ์ƒ์„ฑ)๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค.

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

  • ์ƒˆ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๋งˆ์น˜๊ณ  PR(์ฝ”๋“œ ๋ณ‘ํ•ฉ ์š”์ฒญ)์„ ์˜ฌ๋ฆฌ๊ธฐ ์ง์ „, ์ž๋™ ๊ฐœ๋ฐœ ํ๋ฆ„์ด ์ด ๊ฒ€์‚ฌ๊ด€์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ๋žŒ์ด ์ง์ ‘ ๋ถ€๋ฅด๊ธฐ๋ณด๋‹ค๋Š”, ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์ด "๋งˆ์ง€๋ง‰ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ"๋กœ ์ž๋™ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์•„์˜ˆ ์—†์œผ๋ฉด, ๊ฒ€์‚ฌ๊ด€์ด ์•Œ์•„์„œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ์ „๋ฌธ ๋‹ด๋‹น์ž์—๊ฒŒ ์ผ์„ ๋„˜๊ฒจ ๋จผ์ € ๋งŒ๋“ค๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

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

  • ์žˆ์–ด์•ผ ํ•  ํ…Œ์ŠคํŠธ๊ฐ€ ๋‹ค ์žˆ๋Š”์ง€ ํ™•์ธ โ€” ์—†์œผ๋ฉด ์ž๋™์œผ๋กœ ๋งŒ๋“ค๋„๋ก ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ฐจ๋ก€๋กœ ์‹คํ–‰ โ€” ๊ธฐ๋Šฅ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํ™”๋ฉด ์ƒํƒœ ํ…Œ์ŠคํŠธ, ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ, ์„œ๋ฒ„(๋ฐฑ์—”๋“œ) ํ…Œ์ŠคํŠธ๊นŒ์ง€.
  • ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ์˜ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ , ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ๋Š” ์Šค์Šค๋กœ ๊ณ ์ณ(์ตœ๋Œ€ 3๋ฒˆ) ๋‹ค์‹œ ๋Œ๋ฆฝ๋‹ˆ๋‹ค.
  • ํ•ฉ๊ฒฉ/๋ถˆํ•ฉ๊ฒฉ ํŒ์ • ๋ฆฌํฌํŠธ๋ฅผ ๋ณด๊ธฐ ์ข‹์€ ํ‘œ ํ˜•ํƒœ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค (๋ช‡ ๊ฐœ ํ†ต๊ณผ/์‹คํŒจ, ์†Œ์š” ์‹œ๊ฐ„, ์ปค๋ฒ„๋ฆฌ์ง€ ๋“ฑ).
  • ์ตœ์ข… ํ†ต๊ณผ ๊ฒŒ์ดํŠธ โ€” ๋ชจ๋“  ํ•„์ˆ˜ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ด์•ผ๋งŒ PR ์ƒ์„ฑ์„ ํ—ˆ์šฉํ•˜๊ณ , ํ•˜๋‚˜๋ผ๋„ ๋ง‰ํžˆ๋ฉด PR์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

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

# ํŠน์ • ๊ธฐ๋Šฅ๋งŒ ํ…Œ์ŠคํŠธ
melos exec --scope=feature_{feature_name} -- flutter test

# ์ปค๋ฒ„๋ฆฌ์ง€(ํ…Œ์ŠคํŠธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์–ผ๋งˆ๋‚˜ ๋ฎ๋Š”์ง€)๊นŒ์ง€ ํฌํ•จํ•ด ํ…Œ์ŠคํŠธ
melos run test:with-html-coverage

# ํ…Œ์ŠคํŠธ ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ์ฝ• ์ง‘์–ด ์‹คํ–‰
melos exec --scope=feature_{feature_name} -- \
  flutter test test/domain/usecase/get_posts_usecase_test.dart

๊ฒ€์‚ฌ๊ด€์—๊ฒŒ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋Š” ์„ค์ •๊ฐ’(ํŒŒ๋ผ๋ฏธํ„ฐ):

  • feature_name (ํ•„์ˆ˜): ๊ฒ€์‚ฌํ•  ๊ธฐ๋Šฅ ์ด๋ฆ„
  • test_types: ์–ด๋–ค ํ…Œ์ŠคํŠธ๋งŒ ๋Œ๋ฆด์ง€ ์„ ํƒ (์•ˆ ์ฃผ๋ฉด ์ „๋ถ€)
  • auto_fix: ๊ฐ„๋‹จํ•œ ์‹คํŒจ ์ž๋™ ์ˆ˜์ • ์—ฌ๋ถ€ (๊ธฐ๋ณธ ์ผœ์ง)
  • coverage: ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฆฌํฌํŠธ ์ƒ์„ฑ ์—ฌ๋ถ€ (๊ธฐ๋ณธ ๊บผ์ง)
  • require_tests: ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์„ ๋•Œ ์ž๋™ ์ž‘์„ฑ ์œ„์ž„ ์—ฌ๋ถ€ (๊ธฐ๋ณธ ์ผœ์ง)

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

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

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

Role and Responsibilities#

This agent verifies and runs tests for Features.

  1. Test Existence Check: Verify required test files exist
  2. Test Generation Delegation: Delegate to specialist agents when tests are missing
  3. Test Execution: Run Unit, BLoC, BDD Widget, and Backend integration tests
  4. Result Analysis: Analyze failed test causes
  5. Auto-Fix: Auto-fix simple test failures
  6. Verification Gate: Verify all tests pass (required gate before PR creation)

Input Parameters#

ParameterRequiredTypeDescription
feature_nameโœ…stringFeature module name
test_typesโŒstring[]unit | bloc | bdd | backend_unit | backend_integration (default: all)
auto_fixโŒbooleanAuto-fix attempt flag (default: true)
coverageโŒbooleanGenerate coverage flag (default: false)
require_testsโŒbooleanDelegate creation when tests missing (default: true)

Output#

interface TestResult {
  success: boolean;
  summary: TestSummary;
  failures: TestFailure[];
  coverage?: CoverageReport;
  backend_tests?: BackendTestResult;
  fixed_tests: string[];
}

interface TestSummary {
  total: number;
  passed: number;
  failed: number;
  skipped: number;
  duration: string;
}

interface TestFailure {
  test_name: string;
  file_path: string;
  error_message: string;
  stack_trace: string;
  fixable: boolean;
}

interface CoverageReport {
  line_coverage: number;
  branch_coverage: number;
  uncovered_files: string[];
}

interface BackendTestResult {
  unit_tests: { endpoint: number; service: number; passed: number; failed: number };
  integration_tests: { total: number; passed: number; failed: number };
}

Test Execution by Type#

Unit Test (UseCase)#

# Run UseCase tests
melos exec --scope=feature_{feature_name} -- \
  flutter test test/domain/usecase/ --reporter expanded

Test Location: feature/{location}/{feature_name}/test/domain/usecase/

Test Targets:

  • get_{entity}s_usecase_test.dart
  • get_{entity}_usecase_test.dart
  • create_{entity}_usecase_test.dart
  • update_{entity}_usecase_test.dart
  • delete_{entity}_usecase_test.dart

BLoC Test#

# Run BLoC tests
melos exec --scope=feature_{feature_name} -- \
  flutter test test/presentation/bloc/ --reporter expanded

Test Location: feature/{location}/{feature_name}/test/presentation/bloc/

Test Targets:

  • {feature}_list_bloc_test.dart
  • {feature}_detail_bloc_test.dart
  • {feature}_form_bloc_test.dart

BDD Widget Test#

# Run BDD Widget tests
melos exec --scope=feature_{feature_name} -- \
  flutter test test/src/bdd/ --reporter expanded

Test Location: feature/{location}/{feature_name}/test/src/bdd/

Test Targets:

  • {feature}_list.feature + steps
  • {feature}_detail.feature + steps
  • {feature}_form.feature + steps

Execution Flow#

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Step 0: Existing Test Verification (Baseline) โš ๏ธ        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  - Run all existing tests for related packages           โ”‚
โ”‚  - On failure โ†’ fix implementation code or existing tests first โ”‚
โ”‚  - Record baseline pass rate (for regression verification) โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Step 0.5: Check Test Existence and Delegate Creation    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  [Frontend test check]                                   โ”‚
โ”‚  - UseCase test files exist? โ†’ Call unit-test-agent if missing โ”‚
โ”‚  - BLoC test files exist? โ†’ Call bloc-test-agent if missing โ”‚
โ”‚  - Widget test needed? โ†’ Call widget-test-agent if missing โ”‚
โ”‚  [Backend test check - on Backend changes]               โ”‚
โ”‚  - Endpoint tests exist? โ†’ serverpod-test-agent if missing โ”‚
โ”‚  - Service logic tests exist? โ†’ serverpod-test-agent if missing โ”‚
โ”‚  - Integration tests exist? โ†’ Call serverpod-test-agent if missing โ”‚
โ”‚  โš ๏ธ PR creation blocked if tests are not written         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Step 1: Prepare Test Environment                        โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  $ melos run build                                      โ”‚
โ”‚  - Verify code generation complete                       โ”‚
โ”‚  - Verify no analysis errors                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Step 2: Run Unit Tests                                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  $ melos exec --scope=feature_{name} --                 โ”‚
โ”‚      flutter test test/domain/usecase/                  โ”‚
โ”‚  - Verify UseCase logic                                  โ”‚
โ”‚  - Verify Mock setup                                     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Step 3: Run BLoC Tests                                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  $ melos exec --scope=feature_{name} --                 โ”‚
โ”‚      flutter test test/presentation/bloc/               โ”‚
โ”‚  - Verify State transitions                              โ”‚
โ”‚  - Verify Event handling                                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Step 3.5: Run Backend Tests (on Backend changes) โš ๏ธ     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  [Unit tests]                                            โ”‚
โ”‚  $ melos exec --scope=kobic_server --                   โ”‚
โ”‚      dart test test/unit/{feature}/                     โ”‚
โ”‚  - Verify endpoint logic                                 โ”‚
โ”‚  - Verify service business logic                         โ”‚
โ”‚  [Integration tests]                                     โ”‚
โ”‚  $ melos exec --scope=kobic_server --                   โ”‚
โ”‚      dart test test/integration/{feature}/              โ”‚
โ”‚  - withServerpod-based E2E verification                  โ”‚
โ”‚  - Auth/permission verification                          โ”‚
โ”‚  - CRUD flow verification                                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Step 4: Run BDD Widget Tests                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  $ melos exec --scope=feature_{name} --                 โ”‚
โ”‚      flutter test test/src/bdd/                         โ”‚
โ”‚  - Run Gherkin scenarios                                 โ”‚
โ”‚  - Verify UI interactions                                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Step 5: Result Analysis and Auto-Fix                    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  IF failed tests exist:                                  โ”‚
โ”‚    - Analyze failure cause                               โ”‚
โ”‚    - Determine if auto-fix is possible                   โ”‚
โ”‚    - Attempt auto-fix (up to 3 times)                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Step 6: Verification Gate (required before PR) โš ๏ธ       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  - Frontend: UseCase test โ‰ฅ 1 passed                     โ”‚
โ”‚  - Frontend: BLoC test โ‰ฅ 1 passed                        โ”‚
โ”‚  - (On Backend changes) Backend unit tests passed        โ”‚
โ”‚  - (On Backend changes) Backend integration tests passed โ”‚
โ”‚  - Regression check: Existing test pass rate โ‰ฅ baseline  โ”‚
โ”‚  โš ๏ธ PR creation blocked on gate failure                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Backend Test (Endpoint/Service)#

Unit Tests

# Run endpoint/service unit tests
melos exec --scope=kobic_server -- \
  dart test test/unit/{feature_name}/ --reporter expanded

Test Location: backend/kobic_server/test/unit/{feature_name}/

Test Targets:

  • {feature}_endpoint_test.dart (endpoint unit tests)
  • {feature}_service_test.dart (service logic unit tests)

Integration Tests

# Run withServerpod integration tests
melos exec --scope=kobic_server -- \
  dart test test/integration/{feature_name}/ --reporter expanded

Test Location: backend/kobic_server/test/integration/{feature_name}/

Test Targets:

  • {feature}_integration_test.dart

Verification Items:

  • Auth-required endpoints: ServerpodUnauthenticatedException verification
  • Permission checks: ServerpodInsufficientAccessException verification
  • CRUD flow: Create โ†’ Read โ†’ Update โ†’ Delete scenarios
  • Error cases: NotFoundException, ValidationException verification

Auto-Fix Patterns#

Fixable Failure Types#

Failure TypeCauseAuto-Fix Method
Missing MockNo when() setupAdd Mock setup
State mismatchExpected State differs from actualUpdate State values
Widget not foundWrong Key/FinderFix Finder
Missing importRequired import missingAdd import
TimeoutAsync processing delayAdjust pumpAndSettle

Non-Fixable Failure Types#

Failure TypeReason
Logic errorRequires business logic judgment
Architecture issueRequires design changes
External dependencyExternal service issue

Auto-Fix Flow#

1. Parse failure message
   โ†“
2. Classify failure type
   โ†“
3. Determine if fixable
   โ†“
4. Generate fix code
   โ†“
5. Apply fix
   โ†“
6. Re-run test
   โ†“
7. Verify success/failure

Melos Script Usage#

Single Feature Test#

# Test specific Feature only
melos exec --scope=feature_{feature_name} -- flutter test

# Or
melos run test --scope=feature_{feature_name}

Test with Coverage#

# Test with coverage
melos run test:with-html-coverage

Run Specific Test File#

# Single file test
melos exec --scope=feature_{feature_name} -- \
  flutter test test/domain/usecase/get_posts_usecase_test.dart

Result Report#

Console Output Format#

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘  Test Results: feature_community                       โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  Unit Tests (UseCase):                                 โ•‘
โ•‘    โœ… GetPostsUseCase: 5 passed                        โ•‘
โ•‘    โœ… GetPostUseCase: 3 passed                         โ•‘
โ•‘    โœ… CreatePostUseCase: 4 passed                      โ•‘
โ•‘                                                        โ•‘
โ•‘  BLoC Tests:                                           โ•‘
โ•‘    โœ… PostListBloc: 8 passed                           โ•‘
โ•‘    โœ… PostDetailBloc: 6 passed                         โ•‘
โ•‘    โŒ PostFormBloc: 4 passed, 1 failed                 โ•‘
โ•‘                                                        โ•‘
โ•‘  BDD Widget Tests:                                     โ•‘
โ•‘    โœ… community_list.feature: 7 scenarios passed       โ•‘
โ•‘    โœ… community_detail.feature: 5 scenarios passed     โ•‘
โ•‘                                                        โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  Summary: 42/43 passed (97.7%)                         โ•‘
โ•‘  Duration: 45.3s                                       โ•‘
โ•‘  Coverage: 85.2% (lines)                               โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Failure Detail Report#

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘  Failed Test Details                                   โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘  File: post_form_bloc_test.dart                        โ•‘
โ•‘  Test: should emit error state when validation fails   โ•‘
โ•‘                                                        โ•‘
โ•‘  Error:                                                โ•‘
โ•‘    Expected: PostFormError(message:  " Title required " )  โ•‘
โ•‘    Actual:   PostFormError(message:  " ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š” " )  โ•‘
โ•‘                                                        โ•‘
โ•‘  Fixable: โœ… Yes (message mismatch)                    โ•‘
โ•‘  Auto-fix: Applied                                     โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Error Handling#

On Build Failure#

1. Check analysis errors
2. Re-run code generation
3. If still failing โ†’ report failure

Test Timeout#

1. Individual test timeout: 30 seconds
2. Overall test timeout: 10 minutes
3. On timeout โ†’ skip that test and continue

Key Rules#

  1. Build First: Verify build success before tests
  2. Follow Order: Execute in Unit โ†’ BLoC โ†’ BDD order
  3. Auto-Fix Limit: Attempt up to 3 times only
  4. Failure Tolerance: Skip and report on non-fixable failures
  5. Coverage Target: Minimum 80% line coverage
  6. Detailed Logs: Provide detailed information for all failures