Community写作与编辑github.com

photoeven2-netizen/astronusa

使用 `package:test` 为 Dart 函数、方法和类编写并组织单元测试。在创建新逻辑或修复缺陷时使用,确保代码保持正确且无回归。

astronusa 是什么?

该技能专为在 Dart 和 Flutter 项目中编写和组织单元测试而设计。它严格遵循 Dart 官方的 package:test 测试框架,指导开发者如何结构化测试文件、编写测试用例(包括同步和异步测试)、使用 group() 和 test() 函数、以及通过 expect() 和匹配器进行断言。技能还提供了完整的测试工作流程图,从创建测试文件、导入库、定义主函数、设置共享资源(setUp)、编写分组测试,到执行测试和反馈循环,确保测试覆盖全面且高效。此外,它还涵盖了使用 Mockito 进行依赖注入模拟,支持 package:test、package:flutter_test 和 package:mockito 等主流测试库。最终目标是帮助开发者确保代码正确无误并防止回归。

兼容平台~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/photoeven2-netizen/astronusa/tree/HEAD/.agents/skills/dart-add-unit-test

Installed? Explore more 写作与编辑 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

测试 Dart 与 Flutter 应用

目录

测试文件结构

将测试文件组织为与 lib 目录结构镜像,以保持可预测性。

  • 将所有测试代码放置在包根目录下的 test 目录中。
  • 在所有测试文件名末尾添加 _test.dart 后缀(例如,lib/src/utils.dart 应在 test/src/utils_test.dart 中测试)。
  • 如果编写集成测试,则将其放置在包根目录下的 integration_test 目录中。

编写测试

使用 package:test 作为 Dart 应用的标准测试库。

  • 导入 package:test/test.dart(Flutter 使用 package:flutter_test/flutter_test.dart)。
  • 使用 group() 函数对相关测试进行分组,以提供共享上下文。
  • 使用 test() 函数定义单个测试用例。
  • 使用 expect() 函数配合匹配器(例如 equals()、isTrue、throwsA())验证结果。
  • 使用标准 async/await 语法编写异步测试。测试运行器会自动等待 Future 完成。
  • 使用 setUp() 和 tearDown() 回调管理测试的设置和清理。
  • 如果测试依赖注入的代码,请使用 package:mockito 配合 package:test 生成模拟对象、配置固定场景并验证交互。

执行测试

根据项目类型和测试位置选择合适的测试运行器。

  • 如果使用纯 Dart 项目,使用 dart test 命令执行测试。
  • 如果使用 Flutter 项目,使用 flutter test 命令执行测试。
  • 如果运行集成测试,显式指定目录路径,因为默认运行器会忽略它:dart test integration_test 或 flutter test integration_test。

测试实现工作流程

在实现新测试套件时遵循此顺序工作流程。复制清单以跟踪进度。

任务进度

  • 1. 在 test/ 目录中创建测试文件,确保包含 _test.dart 后缀。
  • 2. 导入 package:test/test.dart 和目标库。
  • 3. 定义 main() 函数。
  • 4. 使用 setUp() 初始化共享资源或模拟对象。
  • 5. 使用 group() 按功能分组编写 test() 用例。
  • 6. 使用适当的 CLI 命令执行测试套件。
  • 7. 反馈循环:运行测试 -> 查看堆栈跟踪以了解失败原因 -> 修复实现或断言 -> 重新运行直到通过。

示例

标准单元测试套件

演示分组、设置、同步和异步测试。

import 'package:test/test.dart';
import 'package:my_package/calculator.dart';

void main() {
  group('Calculator', () {
    late Calculator calc;

    setUp(() {
      calc = Calculator();
    });

    test('正确相加两个数字', () {
      expect(calc.add(2, 3), equals(5));
    });

    test('处理异步操作', () async {
      final result = await calc.fetchRemoteValue();
      expect(result, isNotNull);
      expect(result, greaterThan(0));
    });
  });
}

使用 Mockito 进行模拟

演示配置用于依赖注入测试的模拟对象。

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';

// 使用 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('在 API 调用成功时返回解析后的数据', () async {
      // 配置模拟
      when(mockApiClient.get('/data')).thenAnswer((_) async => '{"id": 1}');

      // 执行被测系统
      final result = await dataService.fetchData();

      // 验证结果和交互
      expect(result.id, equals(1));
      verify(mockApiClient.get('/data')).called(1);
    });
  });
}

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相关技能