skill: add dart skills
This commit is contained in:
141
.agents/skills/dart-collect-coverage/SKILL.md
Normal file
141
.agents/skills/dart-collect-coverage/SKILL.md
Normal file
@@ -0,0 +1,141 @@
|
||||
---
|
||||
name: dart-collect-coverage
|
||||
description: Collect coverage using the coverage packge and create an LCOV report
|
||||
metadata:
|
||||
model: models/gemini-3.1-pro-preview
|
||||
last_modified: Fri, 24 Apr 2026 15:14:32 GMT
|
||||
---
|
||||
# Implementing Dart and Flutter Test Coverage
|
||||
|
||||
## Contents
|
||||
- [Testing Fundamentals](#testing-fundamentals)
|
||||
- [Coverage Directives](#coverage-directives)
|
||||
- [Workflow: Configuring and Generating Coverage Reports](#workflow-configuring-and-generating-coverage-reports)
|
||||
- [Workflow: Advanced Manual Coverage Collection](#workflow-advanced-manual-coverage-collection)
|
||||
- [Examples](#examples)
|
||||
|
||||
## 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:
|
||||
```bash
|
||||
dart pub add dev:coverage
|
||||
```
|
||||
|
||||
If working in a Flutter project:
|
||||
```bash
|
||||
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.
|
||||
|
||||
```bash
|
||||
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).
|
||||
|
||||
```bash
|
||||
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.
|
||||
|
||||
```bash
|
||||
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.
|
||||
|
||||
```bash
|
||||
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`.
|
||||
|
||||
```yaml
|
||||
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.
|
||||
|
||||
```dart
|
||||
// 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
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user