gradleはテストの並列実行をサポートしています。
並行テストはテストケース単位でおこなわれるためたくさんのユニットテストを抱えたプロジェクトのテスト時間を短縮するのにとても効力を発揮します。
並列実行の設定はとても簡単。
http://gradle.monochromeroad.com/docs/userguide/java_plugin.html
build.gradleファイルに以下のようにtestタスクのmaxParallelForksを追加するだけです。
ここでは10にしているがマシンのリソースが許すなら大きな値をとることで並列実行を追加していくことも可能です。
test {
maxParallelForks 10
}
しかし並列実行の場合に注意しなければいけないことがいくつかあります。
- テストデータの整合性
同一のデータベースを利用した時にテストケース実行の前後によって結果がことなってしまったり失敗したりする。 - ひとつひとつのテストケースの実行時間が長い場合は並列実行の意味が薄くなる。
1の解決は簡単です。
1クラス1テストケースではなく1つのクラスのテストケースをメソッド単位で複数に分けてしまうことによって解決できます。細かくわけすぎるとテストケース数の肥大化による管理コストが増大してしまうので、適切なサイジングとパッケージでの切り分けをうまく設計する必要があるでしょう。
また古き良きオブジェクト指向にこだわらず、関数型プログラムを意識して行くことも効果的です。
関数型が改めて台頭してきた一番大きな理由はテストの簡便さです。
Scalaなどの言語を経験している方はわかると思いますが、オブジェクトが状態を保持しない、
オブジェクトの状態を書き換えないという二点を意識するだけでテスト作成の工数が格段に少なくなります。
オブジェクトはあくまで部品でありデータ型の一つと捉えた書き方をしていくことで折り合いを付けて行くのが良いと考えます。
2の解決方法としてはテストケースごとにデータベースやファイルを分けてしまうことです。
テストケースごとにデータベースの構築と破棄を行うとなるとケースが膨大になった時にかなりのオーバーヘッドになってしまうのが難点であり1のテストケースを細かく分類するということと相反してしまいます。
(2)の記事は試行錯誤後に改めてデータベースなどの取り扱いについてまとめます。