前提
用意するテストケース
サンプルコードとしてよく用いられるFizzBuzzのコードを使用します。
今回は1つのテストクラスに4つのテストコードを準備しました。
また、実装コードには1秒のスリープを実装しており、1スレッドであれば4秒強かかるテストです。
同一の内容で複数のテストクラスを用意して、実行時間を計測します。
@Test
public void 引数に15を与えたらFizzBuzzを返す() {
FizzBuzz fizzbuzz = new FizzBuzz();
assertEquals("FizzBuzz", fizzbuzz.response(15));
}
@Test
public void 引数に3を与えたらFizzを返す() {
FizzBuzz fizzbuzz = new FizzBuzz();
assertEquals("Fizz", fizzbuzz.response(3));
}
@Test
public void 引数に5を与えたらBuzzを返す() {
FizzBuzz fizzbuzz = new FizzBuzz();
assertEquals("Buzz", fizzbuzz.response(5));
}
@Test
public void 引数に1を与えたら1を返す() {
FizzBuzz fizzbuzz = new FizzBuzz();
assertEquals("1", fizzbuzz.response(1));
}
並列処理の設定方法(実行時スレッド数の設定)
build.gradle
// 省略
test {
useJUnitPlatform()
maxParallelForks = 4 // ここに最大スレッド数を指定
}
検証結果
最大スレッド数 | 実行クラス数 | 総テストケース数 | 実行時間 | 考察 |
---|---|---|---|---|
1 | 1 | 4 | 約4秒 | |
1 | 4 | 16 | 約16秒 | 単純計算で前ケース4倍となった |
2 | 1 | 4 | 約4秒 | 同一クラスでは並列処理は実行できないため、1スレッドの場合と結果に変化無し |
2 | 4 | 16 | 約8秒 | 2スレッドで4クラスを処理するため、実行時間が半分となった |
4 | 1 | 4 | 約4秒 | 同一クラスでは並列処理は実行できないため、1スレッドの場合と結果に変化無し |
4 | 4 | 16 | 約4秒 | 4スレッドで4クラスを処理するため、実行時間が1クラス分と同じになった |
4 | 5 | 16 | 約4秒 | 4クラスのみの為、5スレッド目は有効とならず前ケースと同じ結果となった |
結論
- 同一クラスのテストは必ず同一スレッド上で実行されるため、並列処理されない
- 複数クラスのテストはスレッド数と実行時間が反比例の関係となった
注意点
- JUnitの実行レポートは全ての実行時間を足した結果であるため、実際の実行時間とは異なります。今回は、ビルド結果のログ情報に出力された時間を参考に計測しています。
- 今回は全てのテストクラスを同一の処理にしているため、スレッド数と実行時間が反比例の関係となりましたが、各テストクラスの規模により、効果は大きく変わってきます。