dart-collect-coverage

작성자: flutter

coverage 패키지를 사용하여 커버리지를 수집하고 LCOV 보고서를 생성합니다

npx skills add https://github.com/flutter/agent-plugins --skill dart-collect-coverage

Implementing Dart and Flutter Test Coverage

Contents

Testing Fundamentals

Structure your test suites using the standard Dart testing paradigms. Use package:test for Dart projects and flutter_test for Flutter projects.

  • Unit Tests: Verify individual functions, methods, or classes.
  • Component/Widget Tests: Verify component behavior, layout, and interaction using mock objects (package:mockito).
  • Integration Tests: Verify entire app flows on simulated or real devices.

Coverage Directives

Exclude specific lines, blocks, or entire files from coverage metrics using inline comments. Pass the --check-ignore flag during formatting to enforce these directives.

  • Ignore a single line: // coverage:ignore-line
  • Ignore a block of code: // coverage:ignore-start and // coverage:ignore-end
  • Ignore an entire file: // coverage:ignore-file

Workflow: Configuring and Generating Coverage Reports

Follow this sequential workflow to add the coverage package, execute tests, and generate an LCOV report.

Task Progress Checklist:

  • 1. Add coverage as a dev_dependency.
  • 2. Execute the automated coverage script.
  • 3. Validate the LCOV output.

1. Add Dependencies

Add the coverage package as a dev_dependency to your project. Do not add it to standard dependencies.

If working in a standard Dart project:

dart pub add dev:coverage

If working in a Flutter project:

flutter pub add dev:coverage

2. Collect Coverage and Generate LCOV

Use the bundled test_with_coverage script. This script automatically runs all tests, collects the JSON coverage data from the Dart VM, and formats it into an LCOV report.

dart run coverage:test_with_coverage

Note: If working within a Dart workspace (monorepo), specify the test directories explicitly (e.g., dart run coverage:test_with_coverage -- pkgs/foo/test pkgs/bar/test).

3. Feedback Loop: Validate Output

Run validator -> review errors -> fix:

  1. Verify that the coverage/ directory was created in the project root.
  2. Ensure coverage/coverage.json (raw data) and coverage/lcov.info (formatted report) exist.
  3. If coverage is missing for specific files, ensure they are imported and executed by your test files, or add // coverage:ignore-file if they are intentionally excluded.

Workflow: Advanced Manual Coverage Collection

If you require granular control over the VM service, isolate pausing, or need branch/function-level coverage, use the manual collection workflow.

Task Progress Checklist:

  • 1. Run tests with VM service enabled.
  • 2. Collect raw JSON coverage.
  • 3. Format JSON to LCOV.

1. Run Tests with VM Service

Execute tests while pausing isolates on exit and exposing the VM service on a specific port (e.g., 8181).

dart run --pause-isolates-on-exit --disable-service-auth-codes --enable-vm-service=8181 test &

2. Collect Raw Coverage

Extract the coverage data from the running VM service and output it to a JSON file.

dart run coverage:collect_coverage --wait-paused --uri=http://127.0.0.1:8181/ -o coverage/coverage.json --resume-isolates

Optional: Append --function-coverage and --branch-coverage to gather deeper metrics (requires Dart VM 2.17.0+).

3. Format to LCOV

Convert the raw JSON data into the standard LCOV format.

dart run coverage:format_coverage --packages=.dart_tool/package_config.json --lcov -i coverage/coverage.json -o coverage/lcov.info --check-ignore

Examples

Example: pubspec.yaml Configuration

Ensure your pubspec.yaml reflects the coverage package strictly under dev_dependencies.

name: my_dart_app
environment:
  sdk: ^3.0.0

dependencies:
  path: ^1.8.0

dev_dependencies:
  test: ^1.24.0
  coverage: ^1.15.0

Example: Applying Ignore Directives

Use ignore directives to prevent generated code or untestable edge cases from lowering coverage scores.

// coverage:ignore-file
import 'package:meta/meta.dart';

class SystemConfig {
  final String env;

  SystemConfig(this.env);

  // coverage:ignore-start
  void legacyInit() {
    print('Deprecated initialization');
  }
  // coverage:ignore-end

  bool isProduction() {
    if (env == 'prod') return true;
    return false; // coverage:ignore-line
  }
}

flutter의 다른 스킬

dart-modern-features
flutter
현대화를 위한 후보를 찾으려면:
flutter-fix-layout-issues
flutter
Flutter 레이아웃 오류(오버플로우, 무제한 제약 조건)를 Dart 및 Flutter MCP 도구를 사용하여 수정합니다. "RenderFlex overflowed", "Vertical…" 문제를 해결할 때 사용하세요.
adding-release-notes
flutter
사용자 대상 변경 사항 설명을 DevTools 릴리스 노트에 추가합니다. NEXT_RELEASE_NOTES.md 파일에 개선 사항, 수정 사항 또는 새로운 기능을 문서화할 때 사용하세요.
reviewing-devtools-prs
flutter
DevTools 저장소 전용 PR 리뷰 워크플로로, DevTools 스타일 가이드라인과 일반적인 리뷰 패턴을 적용합니다. 풀 리퀘스트를 리뷰할 때 사용하세요…
dart-use-primary-constructors
flutter
사용자가 Dart에서 구문 및 의미적으로 올바른 primary constructor를 작성하고, 새로운 생성자 구문, 빈 본문 세미콜론 구문 등으로 마이그레이션/사용할 수 있도록 지원합니다.
code-documentation
flutter
효과적인 코드 문서 작성 가이드로, docstrings, JSDoc, dartdoc 및 구현 주석을 포함합니다. 새 코드를 작성하거나 추가할 때 이 스킬을 사용하세요…
api-review
flutter
지정된 코드를 표준 API 설계 지침에 맞춰 검토합니다. 사용자가 API 리뷰를 요청하거나 API 설계에 따라 코드를 확인할 때 이 스킬을 사용하세요…
flutter-accessibility
flutter
Flutter 앱에서 WCAG 2 및 EN 301 549 접근성 표준과 적응형 레이아웃을 구현합니다. 모바일, 웹, 데스크톱 플랫폼에서 시맨틱 주석, 탭 대상 크기(최소 48x48 dp), 텍스트 대비 비율(작은 텍스트 4.5:1, 큰 텍스트 3:1)을 적용합니다. 웹 시맨틱 초기화, 대화형 위젯 래핑, 화면 크기 기반 레이아웃 전환, 키보드/마우스 입력 처리를 위한 결정 로직을 제공합니다. FocusTraversalGroup을 통한 포커스 이동 관리를 포함합니다...