⛳
Flutter Unit Test Utilities
チートシートと活用
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