Flutter Unit Test Utilities

2024/07/05に公開

チートシートと活用

Flutter Unit Test Utilities

ユーティリティ 説明
Basic Test Framework
test 基本的なユニットテストを作成するための関数。 test('adds one to input values', () { expect(calculator.addOne(2), 3); });
group テストを論理的にグループ化するための関数。 group('Calculator', () { test('addOne', () { expect(calculator.addOne(2), 3); }); });
setUp 各テストの前に実行されるセットアップコードを提供。 setUp(() { calculator = Calculator(); });
tearDown 各テストの後に実行されるクリーンアップコードを提供。 tearDown(() { calculator = null; });
setUpAll テストスイート全体の最初に一度だけ実行されるセットアップコードを提供。 setUpAll(() { // Initialize resources });
tearDownAll テストスイート全体の最後に一度だけ実行されるクリーンアップコードを提供。 tearDownAll(() { // Clean up resources });
Assertions
expect テストのアサーションを行うための関数。 expect(result, equals(42));
throwsException 関数が例外を投げることを確認するためのマッチャ。 expect(() => someFunction(), throwsException);
throwsA 特定の例外が投げられることを確認するためのマッチャ。 expect(() => someFunction(), throwsA(isA<SpecificException>()));
returnsNormally 関数が例外を投げずに正常に終了することを確認するためのマッチャ。 expect(() => someFunction(), returnsNormally);
isA オブジェクトが特定の型であることを確認するためのマッチャ。 expect(calculator, isA<Calculator>());
isNot オブジェクトが特定の型でないことを確認するためのマッチャ。 expect(value, isNot(isA<String>()));
isNull オブジェクトがnullであることを確認するためのマッチャ。 expect(value, isNull);
isNotNull オブジェクトがnullでないことを確認するためのマッチャ。 expect(value, isNotNull);
contains コレクションが特定の要素を含むことを確認するためのマッチャ。 expect(list, contains(42));
isEmpty コレクションが空であることを確認するためのマッチャ。 expect(list, isEmpty);
isNotEmpty コレクションが空でないことを確認するためのマッチャ。 expect(list, isNotEmpty);
Matchers
everyElement 全ての要素がmatcherとマッチすればpass expect(list, everyElement(isA<int>()));
anyElement どれかの要素がmatcherとマッチすればpass expect(list, anyElement(equals(42)));
orderedEquals 要素数と要素の順番が一致していればpass expect(list, orderedEquals([1, 2, 3]));
unorderedEquals 順番が異なっていても要素数と各要素が一致していればpass expect(list, unorderedEquals([3, 1, 2]));
unorderedMatches unorderedEqualsと同様だが、expectedにmatcherを指定する expect(list, unorderedMatches([equals(1), equals(2), equals(3)]));
pairwiseCompare 任意の比較関数を指定できる expect(list, pairwiseCompare(expected, (a, b) => a == b, 'comparison'));
containsAll 全ての値が含まれていればpass expect(list, containsAll([1, 2, 3]));
containsAllInOrder 全ての値が順番通り含まれていればpass expect(list, containsAllInOrder([1, 2, 3]));
Stream Matchers
emitsDone 次にdoneイベントが発行されればpass expect(stream, emitsDone);
emits 次にmatcherに一致する値が発行されればpass expect(stream, emits(equals(1)));
emitsError 次にmatcherに一致するエラーが発行されればpass expect(stream, emitsError(isA<Exception>()));
mayEmit 常にpass。matcherに一致した値が発行されたら終了する expect(stream, mayEmit(equals(1)));
emitsAnyOf matchersのどれかにマッチする値が発行されればpass expect(stream, emitsAnyOf([equals(1), equals(2)]));
emitsInOrder matchersにマッチする値が順番通りに発行されればpass expect(stream, emitsInOrder([equals(1), equals(2)]));
emitsThrough matcherに一致する値が一回以上発行されればpass expect(stream, emitsThrough(equals(1)));
mayEmitMultiple 常にpass。mayEmitと異なり、複数回マッチする expect(stream, mayEmitMultiple(equals(1)));
neverEmits matcherに一致する値が発行されなければpass expect(stream, neverEmits(equals(1)));
emitsInAnyOrder matchersにマッチする値が発行されればpass expect(stream, emitsInAnyOrder([equals(1), equals(2)]));
Throws Matchers
throwsA 関数やFeatureが例外をthrowすればpass expect(() => function(), throwsA(isA<Exception>()));
throwsArgumentError ArgumentErrorをthrowする expect(() => function(), throwsArgumentError);
throwsConcurrentModificationError ConcurrentModificationErrorをthrowする expect(() => function(), throwsConcurrentModificationError);
throwsCyclicInitializationError CyclicInitializationErrorをthrowする expect(() => function(), throwsCyclicInitializationError);
throwsException Exceptionをthrowする expect(() => function(), throwsException);
throwsFormatException FormatExceptionをthrowする expect(() => function(), throwsFormatException);
throwsNoSuchMethodError NoSuchMethodErrorをthrowする expect(() => function(), throwsNoSuchMethodError);
throwsNullThrownError NullThrownErrorをthrowする expect(() => function(), throwsNullThrownError);
throwsRangeError RangeErrorをthrowする expect(() => function(), throwsRangeError);
throwsStateError StateErrorをthrowする expect(() => function(), throwsStateError);
throwsUnimplementedError UnimplementedErrorをthrowする expect(() => function(), throwsUnimplementedError);
throwsUnsupportedError UnsupportedErrorをthrowする expect(() => function(), throwsUnsupportedError);
Error Matchers
isArgumentError itemがArgumentErrorである expect(error, isArgumentError);
isCastError itemがCastErrorである expect(error, isCastError);
isConcurrentModificationError itemがConcurrentModificationErrorである expect(error, isConcurrentModificationError);
isCyclicInitializationError itemがCyclicInitializationErrorである expect(error, isCyclicInitializationError);
isException itemがExceptionである expect(error, isException);
isFormatException itemがFormatExceptionである expect(error, isFormatException);
isNoSuchMethodError itemがNoSuchMethodErrorである expect(error, isNoSuchMethodError);
isNullThrownError itemがNullThrownErrorである expect(error, isNullThrownError);
isRangeError itemがRangeErrorである expect(error, isRangeError);
isStateError itemがStateErrorである expect(error, isStateError);
isUnimplementedError itemがUnimplementedErrorである expect(error, isUnimplementedError);
isUnsupportedError itemがUnsupportedErrorである expect(error, isUnsupportedError);
Mocking with Mockito
mockito モックオブジェクトを作成するためのパッケージ。 @GenerateMocks([MyClass]) class MockMyClass extends Mock implements MyClass {}
when モックの動作を定義するための関数。 when(mock.method()).thenReturn(value);
verify モックメソッドが呼び出されたことを検証するための関数。 verify(mock.method()).called(1);
verifyNever モックメソッドが一度も呼び出されていないことを検証するための関数。 verifyNever(mock.method());
verifyZeroInteractions モックオブジェクトで一切のインタラクションがないことを確認するための関数。 verifyZeroInteractions(mock);
captureThat モックの呼び出しから引数をキャプチャするためのユーティリティ。 verify(mock.method(captureThat(isA<String>())));
Widget Testing
testWidgets Flutterウィジェットのテストを行うための関数。 testWidgets('MyWidget has a title and message', (WidgetTester tester) async { await tester.pumpWidget(MyWidget()); expect(find.text('Title'), findsOneWidget); expect(find.text('Message'), findsOneWidget); });
find ウィジェットを検索するためのユーティリティ。 find.text('Hello'); find.byType(FlatButton);
pumpWidget ウィジェットツリーをレンダリングするための関数。 await tester.pumpWidget(MyWidget());
pump ウィジェットツリーを再レンダリングするための関数。 await tester.pump();
pumpAndSettle アニメーションやレンダリングが完了するまで待機するための関数。 await tester.pumpAndSettle();
tap ウィジェットをタップするための関数。 await tester.tap(find.byType(FlatButton));
enterText テキストフィールドにテキストを入力するための関数。 await tester.enterText(find.byType(TextField), 'hello');
drag ウィジェットをドラッグするための関数。 await tester.drag(find.byType(ListView), Offset(0, -300));
longPress ウィジェットを長押しするための関数。 await tester.longPress(find.byType(Button));
Async Operations
async/await 非同期操作をテストするための標準的なDart構文。 await myAsyncFunction();
expectLater 非同期の期待を表現するための関数。 expectLater(myStream, emitsInOrder([1, 2, 3]));
Miscellaneous
FakeAsync 非同期操作を同期的にテストするためのユーティリティ。 fakeAsync((async) { async.elapse(Duration(seconds: 1)); });
Logger ログをキャプチャして検証するためのユーティリティ。 final logger = Logger(); expect(logger.logs, contains('Expected log message'));

Discussion