dart-add-unit-test について
Dartのコマンドラインおよびバックエンドプロジェクト向けに、ユニットテスト、依存関係のモック、カバレッジ確認を案内するスキルです。`package:test`と`mocktail`を基本とし、テスト作成から実行・確認までの手順を示します。
主な機能
- 01`package:test`のユニットテスト規約
- 02Arrange-Act-Assertのテスト構成
- 03mocktailまたはmockitoによる依存のモック
- 04モックの呼び出し検証
- 05カバレッジ用コマンドと目標
- 06段階的なテスト実行チェックリスト
活用シーン
- 01Dartのビジネスロジックのテスト
- 02リポジトリ依存のモック
- 03メソッド呼び出しと順序の検証
- 04DartまたはFlutterのカバレッジ確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dhruvanbhalara/ skills --skill dart-add-unit-testインストール後、Claude Code で/dart-add-unit-testを入力して読み込まれたか確認します。
詳細
Dart テストスイート
目次
ユニットテスト
Dart の CLI およびバックエンドアプリケーションの標準テストライブラリとして package:test を活用します。
- テストファイルは
libディレクトリの構造を反映するように整理します。テストファイルには_test.dartを付けます。 - 関連するテストは
group()関数を使ってグループ化します。 - 共有のテスト状態には
setUp()とtearDown()を使用します。 - Domain/BLoC 内に純粋なロジックを記述し、静的で純粋な関数に抽出して 100% のユニットテストカバレッジを実現します。
- テストグループ名には文字列補間を使用します:
group('$ClassName', ...) - 各テストは Arrange-Act-Assert(Given-When-Then)の規約に従って構成します:
- Arrange: モックを設定し、インスタンスを生成し、入力データを準備します。
- Act: テスト対象のメソッドを呼び出します。
- Assert: 出力または副作用を検証します。
- テストを読みやすく保守しやすく保つため、セットアップと検証を分離します。
依存関係のモック
mocktail と mockito の選択
| 基準 | mocktail(推奨) | mockito |
|---|---|---|
| コード生成 | 不要 | build_runner が必要 |
| セットアップ速度 | 高速(Mock を継承) | 低速(アノテーション + コード生成) |
| Null 安全 | 完全サポート | 完全サポート |
| API スタイル | when(() => mock.method()) | when(mock.method()) |
| 最適な用途 | ほとんどのプロジェクト、高速なイテレーション | 複雑な API を持つ大規模プロジェクト |
ルール: デフォルトでは mocktail を使用します(コード生成不要でセットアップが高速)。多くのオーバーロードを持つ複雑な API のために @GenerateNiceMocks が必要な場合にのみ mockito を使用します。
mocktail のセットアップ(推奨)
import 'package:mocktail/mocktail.dart';
// Create mock: no code generation needed
class MockUserRepository extends Mock implements UserRepository {}
void main() {
late MockUserRepository mockRepo;
setUp(() {
mockRepo = MockUserRepository();
});
test('fetches user successfully', () {
// Arrange
when(() => mockRepo.getUser('1'))
.thenAnswer((_) async => const User(id: '1', name: 'Alice'));
// Act
final user = await mockRepo.getUser('1');
// Assert
expect(user.name, 'Alice');
verify(() => mockRepo.getUser('1')).called(1);
});
}
mockito のセットアップ(コード生成)
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
@GenerateNiceMocks([MockSpec<UserRepository>()])
import 'user_test.mocks.dart'; // Generated by: dart run build_runner build
検証 API
| API | 目的 |
|---|---|
verify(() => mock.method()).called(1) | メソッドが正確に 1 回呼び出されたことを検証する |
verifyNever(() => mock.method()) | メソッドが呼び出されなかったことを検証する |
verifyNoMoreInteractions(mock) | 未検証のインタラクションが残っていないことを検証する |
verifyInOrder([...]) | メソッドが特定の順序で呼び出されたことを検証する |
reset(mock) | すべてのスタブとインタラクションをクリアする |
フォールバック値の登録
パラメータとしてカスタム型を持つメソッドの場合:
setUpAll(() {
registerFallbackValue(const User(id: '0', name: 'fallback'));
});
テストカバレッジ
- ドメインモデルとビジネスロジックについては 100% のロジックカバレッジを目標とします。
dart test --coverage=coverageまたはflutter test --coverageでカバレッジを実行します。- LCOV/HTML レポート生成の詳細については
dart-coverageスキルを参照してください。
ワークフロー: テストの実行
Dart の機能をテストする際は、この順序に従ったワークフローに沿って進めてください。進捗を追跡するにはチェックリストをコピーしてください。
タスクの進捗
- ステップ 1: ユニットテストを書く。 中核となるビジネスロジックに集中します。ファイル名が
_test.dartで終わることを確認します。 - ステップ 2: モックを生成する。 Mockito を使用している場合は、
dart run build_runner buildを実行してモックを生成します。 - ステップ 3: テストを実行する。
dart testを実行します。 - ステップ 4: カバレッジを確認する。
dart test --coverage=coverageを実行し、カバレッジの目標が達成されていることを確認します。
コメント
Markdown 対応