Jenkinsでのテスト自動化について
これはウイングアーク Agile and DevOps Stories のAdvent Calendar 2022、第5弾(2022年12月7日)の投稿です!
はじめに
ウイングアーク1st SPQI部にて主にSVF製品のQAを担当しています高橋です。SVF以外の製品のテスト自動化も進めているのですが、最近担当したテストについてのちょっとした発見についてのお話です。
並列化されてない・・・
自社開発製品のテスト自動化を進めていたところ、困ったことが発生しました。テストケースの総数が200件ほどあり、各テストケースは入力データ・出力データが独立しているため並列実行が可能なのにもかかわらず、テストコードはマルチスレッドでの実行が考慮されていませんでした。
テストケースを1件ずつ順番に実行する形式となっているため、全テストケースの実行時間が長時間となってしまい、デイリーで繰り返し実行するには非常に非効率な状態です。
すでにテストコードは100件以上の実装および動作確認が完了しており、今からマルチスレッドで実行するためにテストコードを改修すると大きな手戻りが発生してしまいます。さて、どうしたものかと頭を抱えてしまいました。
Jenkinsでやってみよう
まずは、作成済みのテストコードには変更を加えずに実行方法を工夫することで並列実行を実現する方法を模索することにしました。多種多様なプラグインがあるJenkinsなら実現可能性が高いと考え、調査を開始しました。
まずはプラグインで探してみたところ、「Parallel Test Executor Plugin」というそのものズバリが見つかったので試してみました。ところが、設定方法が複雑で分かりやすいサンプル等も見つけることもできず、途中で挫折しました・・・
Antの標準機能であった
Jenkinsでのテスト実行時のビルド手順としてAntを利用しているのですが、あらためてAntのマニュアルを目次から見直したところ、Antの標準機能で並列実行する仕組みがあることがわかりました。
<parallel>を定義することで、各テストを並列で実行することができます。以下の例の様にスレッドカウント数を4とすることで、4つのテストを同時に並列実行することができました。
<parallel threadCount="4">
<junit>
<test name="test001" />
<test name="test002" />
<test name="test003" />
<test name="test004" />
</junit>
</parallel>
直列実行もできる
また、<parallel>の中に<sequential>を定義することで、<sequential>内のテストケースは1つずつ順番に実行することも可能です。テストケースの中には並列で実行されたり、実行順序が異なると、正しいテスト結果が得られない場合があります。そのような場合でも<parallel>と<sequential>を組み合わせることで並列実行と直列実行を分けられるので非常に便利です。
<parallel threadCount="4">
<sequential>
<test name="testSeq001" />
<test name="testSeq002" />
<test name="testSeq003" />
<test name="testSeq004" />
</sequential>
<junit>
<test name="test001" />
<test name="test002" />
<test name="test003" />
<test name="test004" />
</junit>
</parallel>
まとめ
今回の対応を通して並列処理が未実装のコードでもテスト実行環境側での工夫によって、並列実行を簡単に実現できることが分かりました。
過去のテスト資産の変更なしでの有効利用につながるので、今後のテスト自動化と実行時間の効率化に活用していきたいと思います。