目的
Androidプロジェクトで、UnitTestを書いているものの実行は手動でしているため、
うっかり忘れてPushしてCIからの失敗通知で修正するパターンがよくある。
そのため、UnitTestを自動で実行してくれるようにした
Guardとは
ファイルやディレクトリの変更を検知して、任意のタスクを実行させることができるRubyのライブラリ
今回はGradleのタスクを実行できるguard-graldeを使う
導入手順
ほとんどguard-gradleのreadmeと同じ手順
※RubyとBundlerが導入されている前提
※導入していない場合はreadmeにあるinstaller.shを実行する方法で4.まで飛ばせるかもしれない(未検証)
プロジェクト構成
├ .gralde/
├ .idea/
├ app/
├ build.gradle
├ Gemfile # 今回追加ファイル
├ Guardfile # 今回追加ファイル
└ local.properties
-
プロジェクト直下にGemfileを作成して、記述する
Gemfilesource 'https://rubygems.org' gem 'guard-gradle'
-
Guardのインストールを実行する
bundle install
-
Guardfileを生成するコマンドを実行する
bundle exec guard init gradle
-
Guardfileの記述を変更する
- 対象ファイルのディレクトリにappと追加するだけ
Guardfile(変更前)guard :gradle do watch(%r{^src/main/(.+)\.*$}) { |m| m[1].split('.')[0].split('/')[-1] } watch(%r{^src/test/(.+)\.*$}) { |m| m[1].split('.')[0].split('/')[-1] } watch('build.gradle') end
Guardfile(変更後)guard :gradle do watch(%r{^app/src/main/(.+)\.*$}) { |m| m[1].split('.')[0].split('/')[-1] } watch(%r{^app/src/test/(.+)\.*$}) { |m| m[1].split('.')[0].split('/')[-1] } watch('build.gradle') end
-
Guardを実行する
bundle exec guard
ソースコードを変更すると、自動で
./gradlew test
が走る
Gradleのコマンドを変えたい時
デフォルトでは./gradlew test
が走る。
特定のfloverやbuildTypeのみ実行したい場合等、カスタム設定をしたい場合はGuardfileを変更する
guard :gradle do
...
guard :gradle, task: 'testDebugUnitTest', flags: '--offline' do
...
デスクトップ通知をしたい場合
ここにGuardがサポートしている通知ライブラリが書かれているので、よしなに追加する
自分はTerminal Notifierを導入していたので、Gemfileに以下の記述を追加した
gem 'terminal-notifier-guard'