D
dart-add-unit-test
by @dart-langv
4.6(120)
此技能指导如何在 Dart 和 Flutter 应用中编写、组织和执行单元测试。利用 `package:test` 库,确保代码逻辑的正确性,有效防止回归错误,提升开发质量和效率。
安装方式
npx skills add https://github.com/dart-lang/skills --skill dart-add-unit-testcompare_arrows
Before / After 效果对比
1 组使用前
在没有单元测试的情况下,手动验证代码功能,耗时且容易遗漏问题,导致后期修复成本高昂,且难以保证代码质量。
使用后
通过编写和运行单元测试,自动化验证代码逻辑,快速发现并修复问题,显著减少回归错误和调试时间,提升代码健壮性。
SKILL.md
Testing Dart and Flutter Applications
Contents
Structuring Test Files
Organize test files to mirror the lib directory structure to maintain predictability.
- Place all test code within the
testdirectory at the root of the package. - Append
_test.dartto the end of all test file names (e.g.,lib/src/utils.dartshould be tested intest/src/utils_test.dart). - If writing integration tests, place them in an
integration_testdirectory at the root of the package.
Writing Tests
Utilize package:test as the standard testing library for Dart applications.
- Import
package:test/test.dart(orpackage:flutter_test/flutter_test.dartfor Flutter). - Group related tests using the
group()function to provide shared context. - Define individual test cases using the
test()function. - Validate outcomes using the
expect()function alongside matchers (e.g.,equals(),isTrue,throwsA()). - Write asynchronous tests using standard
async/awaitsyntax. The test runner automatically waits for theFutureto complete. - Manage test setup and teardown using
setUp()andtearDown()callbacks. - If testing code that relies on dependency injection, use
package:mockitoalongsidepackage:testto generate mock objects, configure fixed scenarios, and verify interactions.
Executing Tests
Select the appropriate test runner based on the project type and test location.
- If working on a pure Dart project, execute tests using the
dart testcommand. - If working on a Flutter project, execute tests using the
flutter testcommand. - If running integration tests, explicitly specify the directory path, as the default runner ignores it:
dart test integration_testorflutter test integration_test.
Test Implementation Workflow
Follow this sequential workflow when implementing new test suites. Copy the checklist to track your progress.
Task Progress
- 1. Create the test file in the
test/directory, ensuring the_test.dartsuffix. - 2. Import
package:test/test.dartand the target library. - 3. Define a
main()function. - 4. Initialize shared resources or mocks using
setUp(). - 5. Write
test()cases grouped by functionality usinggroup(). - 6. Execute the test suite using the appropriate CLI command.
- 7. Feedback Loop: Run test -> Review stack trace for failures -> Fix implementation or assertions -> Re-run until passing.
Examples
Standard Unit Test Suite
Demonstrates grouping, setup, synchronous, and asynchronous testing.
import 'package:test/test.dart';
import 'package:my_package/calculator.dart';
void main() {
group('Calculator', () {
late Calculator calc;
setUp(() {
calc = Calculator();
});
test('adds two numbers correctly', () {
expect(calc.add(2, 3), equals(5));
});
test('handles asynchronous operations', () async {
final result = await calc.fetchRemoteValue();
expect(result, isNotNull);
expect(result, greaterThan(0));
});
});
}
Mocking with Mockito
Demonstrates configuring a mock object for dependency injection testing.
import 'package:test/test.dart';
import 'package:mockito/mockito.dart';
import 'package:mockito/annotations.dart';
import 'package:my_package/api_client.dart';
import 'package:my_package/data_service.dart';
// Generate the mock using build_runner: dart run build_runner build
@GenerateNiceMocks([MockSpec<ApiClient>()])
import 'data_service_test.mocks.dart';
void main() {
group('DataService', () {
late MockApiClient mockApiClient;
late DataService dataService;
setUp(() {
mockApiClient = MockApiClient();
dataService = DataService(apiClient: mockApiClient);
});
test('returns parsed data on successful API call', () async {
// Configure the mock
when(mockApiClient.get('/data')).thenAnswer((_) async => '{"id": 1}');
// Execute the system under test
final result = await dataService.fetchData();
// Verify outcomes and interactions
expect(result.id, equals(1));
verify(mockApiClient.get('/data')).called(1);
});
});
}
用户评价 (0)
发表评价
效果
易用性
文档
兼容性
暂无评价
统计数据
安装量18.9K
评分4.6 / 5.0
版本
更新日期2026年10月23日
对比案例1 组
用户评分
4.6(120)
5
37%
4
43%
3
13%
2
5%
1
2%
为此 Skill 评分
0.0
兼容平台
🤖claude-code
时间线
创建2026年5月19日
最后更新2026年10月23日