はじめに
世界中のITエンジニアが悩まされている原因不明でテストが失敗する「フレイキーテスト」問題
自動テストを実装しているが成功したり失敗したりしていまいち信頼性が無いテストがあります。
文頭の記事からそれらをフレーキーテストと呼ぶということ、世のエンジニアの皆様もそれに苦慮されていることを知り、なにか対応策を考えられないか画策してみました。
本記事では1例としてJenkinsのプラグインを組み合わせると、フレーキーテストを見つけられそうなので、その設定方法を書き記しておきます。
環境
jenkins 2.320
使用プラグイン
・Jest
jest-junit
・jenkins
test-results-analyzer
Jestの設定
jestのテスト結果をjunitで出力する
プロジェクトにjest-junitを追加します。
jest-junit は Jest で実行したテスト結果をJUnitのXML形式のファイルで出力するパッケージです。
jest.config.jsに下記例のように出力設定を追加します。
$ npm install --save-dev jest-junit
reporters: [
'default',
[
'jest-junit',
{
suiteName: 'jest tests',
outputDirectory: 'junit/',
outputName: 'junit.xml',
classNameTemplate: '{classname}-{title}', //{classname}はdescribeのクラス名を出力します
titleTemplate: '{classname}-{title}', //{title}はtestまたはitのテスト名を出力します
ancestorSeparator: ' › ',
suiteNameTemplate: '{filename}' //{filename}はjestのテストファイル名を出力します
},
],
],
出力設定をしたあとにjestを実行すると下記のようなJUnit形式のテスト結果が出力されます。
これをjenkinで収集します。
<?xml version="1.0" encoding="UTF-8"?>
<testsuites name={suiteName} tests="8" failures="0" errors="0" time="XX.XXX">
<testsuite name={suiteNameTemplate} errors="0" failures="0" skipped="0" timestamp="2022-XX-XXTXX:XX:XX" time="XX.XXX" tests="1">
<testcase classname={classNameTemplate} name={titleTemplate} time="XX.XXX">
</testcase>
</testsuite>
</testsuites>
jenkinsの設定
Jenkinsはデフォルトでビルド毎のJUnitテスト結果が収集可能となっています。
そこにビルドのテスト結果を保存して解析表示するtest-results-analyzerプラグインをインストールします。
設定方法
ジョブの設定でビルド後の処理の追加で「JUnitテスト結果の修正」を追加し「テスト結果XML」にjest-junitで出力したxmlへのファイルパスを記載します。
設定後、実際にジョブを実行した後にメニューからのTest Results Analyzerを選択します。
テスト毎の結果を収集することで、各テストの成功率、よく不安定となるテストを確認することができます。
例えば、②の履歴から、成功したり失敗したりするテストを見つけられます。
<表の説明>
①各テストの一覧とその成功率
②各テストのビルド毎の成功と失敗
③全テスト中最も失敗するテストTOP10
最後に
本記事では1例としてCIにjenkinsを利用した方法を記載しました。
Jestを使用していますが、JUnitでも同等なことができると思います。
ご参考になれば幸いです。
参考
・世界中のITエンジニアが悩まされている原因不明でテストが失敗する「フレイキーテスト」問題
https://www.publickey1.jp/blog/22/itjenkinsdevops_days_tokyo_2022_1.html
・フレーキーテストにまつわるあれこれ
https://qiita.com/seigot/items/bec2c934b762a2f50821
※既存のCIツールにてフレイキーなテストの対策手段が記載されています。
・Detect and track flaky Jest tests
https://buildpulse.io/test-frameworks/jest
※Jestのフレイキーなテストを解析、可視化する有料Webサービス