概要
Flutterでテストコードを書く際、様々なMatcher
を使うことができます。今回のブログポストでは、Flutterのテストコードで使えるMatcher
について紹介し、使い方について説明します。
Matcher
テストコードでMatcherは、特定の値や条件を検証するための検証ツールです。テストが実際の値と期待する値や状態が一致するかどうかを比較する際、Matcherを使ってより表現力豊かで読みやすいテストコードを書くことができます。
FlutterのテストコードでMatcherは、expect
文を通じて値が期待する条件に一致するかを確認する際に主に使用されます。Matcherは単純な値の比較だけでなく、より複雑な条件やさまざまなタイプの検証をサポートします。
例えば:
- equals: 値が特定の値と同じかどうか比較できます。
- isNull: 値がnullかどうかを確認できます。
- contains: コレクションや文字列に特定の項目が含まれているかを検査できます。
- throwsException: 関数が例外をスローするかを確認できます。
void main() {
test('Example', () {
var numbers = [1, 2, 3];
expect(numbers, contains(2));
expect(numbers, isNotEmpty);
expect(() => throw Exception('Error'), throwsException);
});
}
Matcherを使うと、テストコードがより直感的で読みやすくなり、可読性が向上し、複雑な条件や状態を簡潔に処理できます。また、複数の条件を組み合わせたり否定(Negation)することができ、より柔軟なテスト作成が可能です。
よく使われるMatcher
Flutterの公式ドキュメントを確認すると、使用可能なMatcherを確認できます。.
ここでは、よく使われるMatcherを紹介します。
- equals(expected): 与えられた値がexpectedと同じかどうかを確認します。
expect(actual, equals(expected));
- isNot(matcher): 値が与えられたMatcherと一致しないかを確認します。
expect(actual, isNot(equals(5)));
- isTrue / isFalse: 値がtrueまたはfalseかを確認します。
expect(value, isTrue);
- contains(element): コレクションや文字列に特定の要素が含まれているかを確認します。
expect([1, 2, 3], contains(2));
- isNull / isNotNull: 値がnullかどうかを確認します。
expect(value, isNull);
expect(value, isNotNull);
- greaterThan(value) / lessThan(value): 値が与えられた値より大きいか小さいかを確認します。
expect(number, greaterThan(10));
- startsWith(prefix) / endsWith(suffix): 文字列が特定の文字列で始まるか終わるかを確認します。
expect('Flutter', startsWith('Fl'));
- throwsException / throwsA(matcher): 特定の例外が発生するかを確認します。
expect(() => someFunction(), throwsException);
- allOf(matcher1, matcher2, …): 与えられたMatcherがすべて一致するかを確認します。
expect(value, allOf(startsWith('Fl'), contains('utt')));
- anyOf(matcher1, matcher2, …): 与えられたMatcherのいずれかが一致するかを確認します。
expect(value, anyOf(equals(1), equals(2)));
- isA
(): 値が特定の型であるかを確認します。
expect(value, isA<int>());
完了
これで、Flutterのテストコードで使用可能なMatcherについて紹介しました。Matcherを使用すると、テストコードをより直感的で読みやすく書くことができ、さまざまな条件や状態を検証できます。
Flutterのウィジェットテストで、私は下記のようなコードをよく使っていました。
expect(titleContainer.child.runtimeType, Container);
しかし、上記のコードはisA<T>()
Matcherを使用すると次のようにより明確に表現できます。
expect(titleContainer.child, isA<Container>());
皆さんもMatcherを使用してテストコードをより効果的で読みやすく書いてみてください。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。