kevmoo/dart-test-fundamentals
|- Covers `test`, `group`, lifecycle methods (`setUp`, `tearDown`), and configuration (`dart_test.yaml`).
npx skills add https://github.com/kevmoo/dash_skills --skill dart-test-fundamentals
Use this skill when:
group.dart_test.yaml.To find candidates for improving test structure:
try-finally CleanupSearch for tests that use try-finally for cleanup instead of addTearDown:
\bfinally\s*\{ (Check if this is used for resource cleanupinside a test).
test and group)test: The fundamental unit of testing. test('description', () {
// assertions
});
group: Used to organize tests into logical blocks.setUp and tearDown calls.PascalCase for groups that correspond to a class name(e.g., group('MyClient', ...)).
group call if it's the only one.
didn't create unless explicitly asked to. This can cause a LOT of churn
in the DIFF that most engineers won't want!
test('test name here',:group instead.'throws StateError' or 'adds API key to URL').
test and group calls, place named parameters (e.g., testOn,timeout, skip) immediately after the description string, before the
callback closure. This improves readability by keeping the test logic last.
test('description', testOn: 'vm', () {
// assertions
});
setUp, tearDown)setUp: Runs *before* every test in the current group (and nestedgroups).
tearDown: Runs *after* every test in the current group.setUpAll: Runs *once* before any test in the group.tearDownAll: Runs *once* after all tests in the group.Best Practice:
setUp for resetting state to ensure test isolation.test body, consider usingaddTearDown instead of a try-finally block.
Avoid:
test('can create and delete a file', () {
final file = File('temp.txt');
try {
file.writeAsStringSync('hello');
expect(file.readAsStringSync(), 'hello');
} finally {
if (file.existsSync()) file.deleteSync();
}
});
Prefer:
test('can create and delete a file', () {
final file = File('temp.txt');
// Register teardown immediately after resource creation intent
addTearDown(() {
if (file.existsSync()) file.deleteSync();
});
file.writeAsStringSync('hello');
expect(file.readAsStringSync(), 'hello');
});
dart_test.yaml)The dart_test.yaml file configures the test runner. Common configurations
include:
Define where tests run (vm, chrome, node).
platforms:
- vm
- chrome
Categorize tests to run specific subsets.
tags:
integration:
timeout: 2x
Usage in code:
@Tags(['integration'])
import 'package:test/test.dart';
Running tags:
dart test --tags integration
Set default timeouts for tests.
timeouts:
2x # Double the default timeout
_test.dart to be picked up by the test runner.test/ directory.dart test: Run all tests.dart test test/path/to/file_test.dart: Run a specific file.dart test --name "substring": Run tests matching a description.dart-test-fundamentals is the core skill for structuring and configuring
tests. For writing assertions within those tests, refer to:
Use this if the project sticks with the traditional
package:matcher (expect calls).
[dart-matcher-best-practices]: https://github.com/kevmoo/dash_skills/blob/main/skills/dart-matcher-best-practices/SKILL.md
Take kevmoo/dart-test-fundamentals from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.