flutter testで全体のカバレッジが正しく出力されない場合の直し方


flutterでテストを書いてflutter test --coverageでテスト実行してgenhtmlやcodecovでカバレッジを見たら「1ファイルしかテスト書いてないのに100%どういうこと!!???」というときの対処方法です。

原因

flutter(というかdart?)のcoverage生成のオプションではテストファイルから読み込んだテスト対象ファイルしかカバレッジの母数に含めてくれない様子。たぶん。

解決策

こちらのrepoにあるbashをclone, chmodしてproject rootで実行してからflutter test --coverageすれば万事OK。コマンドも丁寧にReadmeに書いてあります。
https://github.com/priezz/dart_full_coverage

もしlib配下のdartファイルを増やしたらもう一度シェルを叩く必要があります。

スクリプトの仕組み

上記のbashスクリプトは test/coverate_test.dartというファイルを作り、その中に全てのlib配下のdartファイルを全てimportしてくれています。そしてmain()の中身を空にすることで「coverage_test.dartではテストはしないが、テストファイルからいったんlib配下のdartファイルを全部読み込むことでカバレッジの母数に含めさせる」という状態を一発で作ってくれます。

具体的には以下のようなファイルが出来上がります。

()
import 'package:myapp/bloc/aaa_bloc.dart';
import 'package:myapp/bloc/bbb_bloc.dart';
import 'package:myapp/bloc/ccc_bloc.dart';
()
import 'package:myapp/widgets/aaa_page.dart';
import 'package:myapp/widgets/bbb_page.dart';
import 'package:myapp/widgets/ccc_page.dart';
()

void main() {}

たったこれだけですが、ちゃんとカバレッジがlib配下全体に対するデータになります。

以上、これで疑心暗鬼なままテストを書く心配が無くなりますね。