Flutterでのテストの作成と保守にかかる時間を短縮する

Jul 25 2022
テストは非常に重要であり、自信の向上やバグの削減など、多くのメリットがあると聞いています。ただし、Flutterのエンドツーエンド/統合テストは、書き込み、デバッグ、および保守に時間がかかることが多く、多くの時間が無駄になります。

テストは非常に重要であり、自信の向上やバグの削減など、多くのメリットがあると聞いています。ただし、Flutterのエンドツーエンド/統合テストは、書き込み、デバッグ、および保守に時間がかかることが多く、多くの時間が無駄になります。これにより、テストはあまり快適な作業ではなくなり、スキップしたくなります(少なくとも私にとっては:/)。したがって、それを再考し、時間の浪費を減らすようにしましょう。

理想対(古い)現実

目を閉じて想像してみましょう。理想的な世界では、テストはどのように見えるべきでしょうか。さて、一言も無駄にせずに、私たちが何が起こると予想するかをコンピュータに伝えてください。それで全部です。そして、テストに合格すると、私たちは自信を持っています。テストが失敗するたびに、ビジネスコードのどこが間違っているかを明確に指摘して、修正できるようにする必要があります。

しかし、それは現実ではありませんでした。現実の世界では、テストの他の側面にはるかに多くの時間が費やされています(読み取り:無駄)。

理想と現実の大きな違いは、テスト失敗の根本原因を特定するために必要な時間です。これは、(一般化された)デバッグ可能性と呼ばれる場合があります。一方では、テストを作成した後、テストにバグがあるか、ビジネスコードに問題があるために、テストに合格する前に数回失敗することがよくあります。一方、リグレッション(以前に合格したテストは現在失敗する)が時々発生します。これは、更新されたコードにいくつかの問題があることを示しています。いずれの場合も、根本原因を突き止めて修正する必要があります。したがって、バグの特定速度が遅いと、時間の無駄になります。

integration_testFlutterフレームワーク全体が非常に素晴らしく、生産的であるにもかかわらず、Flutter'sはこれに関して優れた開発者経験を持っていません。典型的なシナリオを考えてみましょう。エンドツーエンド/統合テストは多くの要素をタップ/ドラッグ/スクロールし、最終的にアサーションで失敗します。次に、どのステップがうまくいかないかを知る方法は?言うまでもなく、このような障害はCI内で発生する可能性があり、CIではログしか利用できないことがよくあります。1つのアプローチは、ログを読み取って分析することです(完全なログシステムがある場合)が、UIやタイムトラベルを調べることで多くのバグをすばやく見つけることができるため、それでも時間がかかります。タップ/ドラッグがあまりにも速く発生することが多く、これはCIモードでは不可能であるため、シミュレーターの表示を注意深く観察することも完璧な選択ではありません。原因を掘り下げる際のその他の詳細も、時間を浪費する可能性があります。

他の側面もあります。再試行可能性の欠如は、時間を浪費します。エンドツーエンド/統合テストでは、ネットワーク要求などの非決定的なイベントが非常に頻繁に発生します。いつ終わるのか正確にはわかりません。したがって、テストは待機と再試行を使用して作成する必要があります。エンドツーエンドのテストでは自然なフレキネスも、いくつかの誤検知を引き起こします。テストの「失敗」を調べるのに時間を費やしたいと思う人は誰もいません。ただ、それが不安定なだけだと気付くだけです。

それ現実の世界でした。もっとうまくやれるでしょうか?

解決策

上記のすべての頭痛の種は、私がオープンソースライブラリを書くことにつながります:

パッケージはflutter_convenient_test、上記の時間の浪費プロセスを最小限に抑えようとします。確かに、それは不完全です(そして若いです)が、私の小さな一歩があなたが時間を節約し、より多くの時間節約の強化を刺激するのに役立つことを願っています。

備考:上に構築されているため、、、などのintegration_testお気に入りのパッケージを引き続き使用し、わずかな変更を加えてこのライブラリに移行できます。integration_testmockitoflutter_test

パッケージがデバッグ可能性のために何をするか見てみましょう。(以下のすべての機能は、CIで実行する場合にも適用できます。データパックが生成され、後でデスクトップで視覚化できます。)

まず、テストで実行されたすべてのアクション/アサーションをわかりやすい説明とともに表示できます。

次に、スクリーンショットを使ってタイムトラベルをすることができます。そのボタンが50ステップ前でもタップされたときのUIはどのように見えましたか?今、私たちはすべてを知っています。

スクリーンショットの代わりにライブで見たいですか?問題ありません—ビデオレコードがあります。

バグの発見を容易にするためのより多くの機能があります。例えば:

  • テストを実行している場合でも、モードを切り替えてアプリをインタラクティブに操作できます。これは、の時代には容易ではないように思われ、そのintegration_testために完全に再起動する必要がありました。
  • コードを変更した後、テストは数分ではなく数秒で再実行できます。
  • 強化されたゴールデン—構成可能な「許容範囲」(ピクセルの一部をゴールデン画像と比較してある程度異なるようにする)。拡大鏡で黄金の違いを調べるための完全なパネル。
  • 単一のテストまたは単一のグループをクリック内で実行できます。
  • 再試行可能性のために、このパッケージpumpは必要に応じて自動的に挿入および再試行するため、人間が介入してコードを記述する必要はまったくありません。
  • フレークネスに関しては、ライブラリはそれを完全に理解しており、失敗したと誤って見なしたり(CIの大きな赤いエラー)、成功したと見なしたりすることはありません。

要約すると、Flutterでのテストには、バグの原因を特定するための余分な時間、再試行可能性の欠如、フレークネスなど、無駄な時間が含まれていることがわかりました。そのため、flutter_convenient_testを最小限に抑えようとしました。それがあなたの時間を節約できることを願っています!

© Copyright 2021 - 2022 | hachiwiki.com | All Rights Reserved