Flutterでtestするときのtips
Flutterアプリでテストを書いていて、モチベを保つ意味でもおおよその目標という意味でもCoverageを測定している。Coverageを眺めながらニヤニヤするのがテストモチベを保つ秘訣だと思ってるんだけど、薄々気づいていたけれど、見て見ぬ振りをしていたことがある。
Coverageとはプロジェクトにあるコードの全体のうちテストによって通過したコードが何割あるのかを計測する方法である。
ここで、テストを書きながら上がっていくCoverageを眺めてニヤニヤしていたのだが、これ実は全体と言いつつ全体じゃなくない?と思った。
調べてみると、テストコードを実行するときにimportされたファイルが対象となるらしい。
そこで、こんなレポジトリを見つけた。
これはFlutterProject配下でシェルスクリプトを実行することで、lib配下の全てのdartファイルをimportするcoverage_test.dartを生成してくれる。
そうすることで、Coverageの対象がプロジェクトのすべてのdartファイルになる。
上記を実行した結果、、、Coverageが爆落ちした。。。。
Coverageの範囲をプロジェクト全体にしたことで、Coverageが爆落ちして、モチベも下がってしまうので、一旦適切な範囲でCoverageを算出したい。
自分のプロジェクトはざっくりと下記の4層に別れている。厳密ではないが大体MVVM+Repositoryを意識して構成している。
・View
・ViewModel
・Model
・Repository
テストコードをプロジェクトの途中から書き始めたこともあり、現状はViewModel層のテストしかかけていないためViewModelだけをCoverageの対象にしたい。(そもそも、Coverageの対象を全体にしたかったっていう話は一旦置いておこう。)
調べてみると、Coverageの対象から外す方法がわかった。
flutter test --coverage
を実行後に
lcov --remove coverage/lcov.info {対象外にしたいファイル名} -o coverage/lcov.info
を実行することで、lcov.infoが上書きされて対象外にしたいファイルがCoverageの対象から外れる。
実際にはCoverageを見やすくするために、上記の2コマンドを打った後にgenhtml coverage/lcov.info -o coverage/html
を実行するので、これらをシェルスクリプトにまとめておく。
#!/bin/sh
flutter test --coverage
lcov --remove coverage/lcov.info 'lib/presentation/widgets/*' 'lib/repository/*' -o coverage/lcov.info
genhtml coverage/lcov.info -o coverage/html
今回はWidgetsディレクトリとRepositoryディレクトリ配下のファイルをCoverage集計の対象外とすることにした。
ほんとはWidgetテストとか全部書いてCoverageの対象をプロジェクト全体にしたいけど、それはまたいつかの話
このスクラップを書いてからずっとShellScriptじゃなくてdart cliで実現したいと思ってましたが、ついにpub.devに公開しました。
下記でtest_coverage.dartが生成されます。
dart pub global activate dtt
dtt full_coverage