【登壇しました】「テストの可読性を支える技術」と、登壇のメリットなど

Dart

概要

どうも、@daiki1003です!

お久しぶりのブログになってしまいました。

さて、10/23 (土)に「DevFest Kyoto 2021 Flutterテスト講座」に登壇しました。

DevFest Kyoto 2021 (2021/10/23 13:30〜)
# 概要 DevFest は、世界各国のGDGが8月〜12月に開催するグローバルイベントです。 各地のGDGが趣向を凝らしたイベントを開催します。 GDG Kyoto では、Flutter開発でテストができるようになる視点や技術基礎と経験談を紹介します。 ## コンセプト Flutter を使ったプロダク...

発表内容スライドはこちらです。
気付いたら3,700人もの方に見ていただいて本当にありがとうございます!!

本記事では、

・発表と同等の内容を軽くまとめ
・登壇のメリットなど

の2つについて書いていきたいと思います。

・テスト書いてるのは良いけど、可読性低いんだよなぁ…
・登壇を考えてるんだけどコスパ悪すぎでは…

なんて人に最適な記事になってると思います!

それでは行きましょー!

テストの可読性を支える技術

本発表では、1つの概念と3つのパッケージを説明しました。

・group
given_when_then
flutter_test_ui
dart_dot_reporter

簡単に一つずつ説明したいと思います。
詳しくは、各パッケージページやスライドをどうぞ!

group

テストをグループ化出来ます。
また、 VSCodeであれば結果もグループによってまとまって出力されたりもします。

個人的には、この groupで RSpecの様に
describe, context, it
なんかを表現するのも良いなーと思っています。

group('#Increment Button', () { // describe
  group('displaying "0"', () { // context
    test('displays "1", () { // it
      // test codes...
    });
  });
});

given_when_then

given_when_then | Flutter package
A Flutter package to enable code reuse while making tests more readable.

テストの前提条件(given)、テスト対象の処理(when)、期待する結果(then)を
ラップするパッケージです。
作る人が作れば、テストコードが英語を読むかの様に理解することができます。

test('displays "1", harness(given, when, then) async {
  await given.pumpMyWidget();
  given.canFineZero();
  given.cannotFindOne();

  await when.userTapsIncrementButton();
 
  then.cannotFindZero();
  then.canFindOne();
});

ただ、ちょっとラップするクラスを作るのが大変だったりするので

test('displays "1", (tester) async {
  // given
  await tester.pumpWidget(const MyApp());
  expect(find.text('0'), findsOneWidget);
  expect(find.text('0'), findsNothing);

  // when
  await tester.tap(find.byKey(incrementKey));
  tester.pump();
 
  // then
  expect(find.text('0'), findsNothing);
  expect(find.text('1'), findsOneWidget);
});

くらいで良い気はしています。

flutter_test_ui

flutter_test_ui | Flutter package
Wrapper for flutter_test that adds a tester argument to setUp and tearDown functions

setup, tearDownなどのウィジェットテスト版です。
setupUI, tearDownUI, testUIなどを提供してくれています。

void main() {
  setupUI((tester) async {
    await tester.pump(const MyApp());
  }

  testUI('displays "1"', (tester) async {
    // test code
  });
}

setupではWidgetTesterインスタンスがないので重宝するかもしれません。

dart_dot_reporter

dart_dot_reporter | Dart package
Dot test reporter for Dart & Flutter & Human. Makes test results clear from the high-level view.

こちらはテスト結果の可読性を上げてくれるパッケージです。
ご存知の方も多いかもしれません。

登壇のメリットなど

実は、本記事で一番伝えたいのはこのパートだったりします。

みなさんは普段登壇はされてますか?
個人的には登壇することは強くお勧めします。

理由は以下。

・アウトプットに強制的なタイムリミットを設けられる
・インプットをする際に人に伝えるつもりでインプット出来る
・カラーバス効果

それぞれ軽く説明します。

アウトプットに強制的なタイムリミットを設けられる

xx月xx日にアウトプットをしなければいけない。
必要とあらば、その前にインプットをしなければいけない。

この強制力を自分に働かせられることが僕にとっては一番大きいです。

いろんな誘惑から逃れ、価値のあるアウトプットをするって人間には難しいです。
少なくとも僕にはかなり笑

僕のブログの更新間隔とか見ていただけると分かると思うのですが、
やはり何もないと気が向いた時になってしまい相当間隔が空いてしまいます。

また、締め切りが近づいてきた時ののインプット効率はすごいものがあるなぁと思ってます。
テスト前日にオールして勉強する時の感じですね笑

ただ、何を話すか全然決まらない時は本当に逃げたくなりますしその期間は
本当ストレスがやばいですw

インプットをする際に人に伝えるつもりでインプット出来る

インプットした時に、一番大事なのは「自分の言葉にすること」だと思ってます。

本を読んでも頭に入らないのは納得はしていても自分の言葉になっていないから。

登壇するには、インプットした内容を実践し自分の言葉にするしかありません。

カラーバス効果

この内容について、登壇しようと思うと不思議とそう言った内容の
Mediumの記事であったり、Youtubeのサジェストがすごく目に入ってきます。

短期的に自分の力を伸ばすにはうってつけだなーなんて思っています。

誰かのお役に立てば。

Twitterフォローお願いします

「次回以降も記事を読んでみたい!」
「この辺分からなかったから質問したい!」

そんな時は、是非Twitter (@daiki1003)Instagram (@ashdik_flutter)のフォローお願いします♪

Twitterコミュニティ参加お願いします

Twitterコミュニティ「Flutter lovers」を開設しました!
参加お待ちしております😁

☕️ Buy me a coffee

また、記事がとても役に立ったと思う人は
コーヒーを奢っていただけると非常に嬉しいです!
@daiki1003

コメント

タイトルとURLをコピーしました