Launchable Advent Calendar 6日目 - subset command
Launchableの各機能の利用方法を紹介する Launchable Advent Calendar 6日目です。
はじめに
6日目はPredictive Test Selection(以降PTS)を利用するためのコマンド launchable subset
コマンドについて紹介します。
改めてざっくりPTSについて説明します。
タイポを修正するPRだとしても全てのテストを実行して問題が無いことを確認してからベースのブランチへマージする。
のように全てのテストを都度実行するのではなく修正に関連するテストを効率良くテスト出来たらと思ったことはありませんか?
過去のテスト結果や修正されたファイルの情報を元に機械学習により学習モデルを生成し、テスト時にテスト対象を失敗しやすいであろう順に学習モデルを利用して並び替え/選択するのがLaunchableの提供するPTSになります。
(※PTSは有償サービスになります。link)
launchable subset
ということでPTSを利用するためのコマンド launchable subset
についてKonboi/launchable-java-exampleを使って説明していきます。src/test/java
以下にテストファイルがあります。
launchable subset
コマンドはインプットにテスト対象一覧を与え、アウトプットにインプットされたテスト対象一覧を失敗しやすい順に並び替え/選択し出力します。Mavenプロファイルではインプットとしてテストディレクトリのパスを launchable subset
コマンドに渡します。
成功するとこのような結果が表示されます。
$ tree src/test/java
src/test
└── java
└── example
├── AddTest.java
├── DivTest.java
├── MulTest.java
└── SubTest.java
2 directories, 4 files
$ launchable subset --target 80% maven src/test/java
example.MulTest
example.AddTest
example.SubTest
Launchable created subset 389366 for build example (test session 1609282) in workspace konboi/advent-calendar-2022
| | Candidates | Estimated duration (%) | Estimated duration (min) |
|-----------|--------------|--------------------------|----------------------------|
| Subset | 3 | 75 | 5e-05 |
| Remainder | 1 | 25 | 1.66667e-05 |
| | | | |
| Total | 4 | 100 | 6.66667e-05 |
Run `launchable inspect subset --subset-id 389366` to view full subset details
もう少し細かく説明していきます。
--target 80%
というオプションを使用していますがこれは、渡したテスト一覧から失敗しやすいテストの想定実行総時間の80%分を返してくれ。というオプションになり AddTest
, DivTest
, MullTest
, Subtest
の中から80%に収まるように MulTest
, AddTest
, SubTest
の3つをLaunchableが返しています。
--target
以外のオプションもあるので後ほど説明します。
GitHub Actionsでの例
Day 5のGitHub Actionsの設定ファイルに launchable subset
コマンドを追加します。
2点変更しました。
1点目は説明した launchable subset
コマンドを使用してテストすべき一覧を取得。
2点目はsubsetの結果を利用してのテスト実行です。mvn
コマンドは -Dsurefire.includesFile
オプションを指定することで、実行するテスト一覧をファイルで渡す事ができます。
これで毎回全てのテストを実行していましたが、失敗しやすいテスト80%分のみをテストするようになりました。
run: launchable verify
- name: record build
run: launchable record build --name ${GITHUB_RUN_ID}
+ - name: subset
+ run: launchable subset --target 80% maven src/test/java > launchable-subset.txt
- name: Run tests
- run: mvn test
+ run: mvn test -Dsurefire.includesFile=launchable-subset.txt
- name: launchable record tests
run: launchable record tests maven target/surefire-reports/TEST-example.*.xml
if: always()
成功すると全部で4件だった launchable record tests
コマンドの結果が3件になったのが確認できます。
Launchable recorded tests for build 3627064656 (test session 1609301) to workspace konboi/advent-calendar-2022 from 3 files:
| Files found | Tests found | Tests passed | Tests failed | Total duration (min) |
|---------------|---------------|----------------|----------------|------------------------|
| 3 | 3 | 3 | 0 | 0.0001 |
Visit https://app.launchableinc.com/organizations/konboi/workspaces/advent-calendar-2022/test-sessions/1609301 to view uploaded test results (or run `launchable inspect tests --test-session-id 1609301`)
いきなり全件テストしていたのを変更するのは抵抗がある方のために --observation
というオプションも提供しています。こちらは別日のAdvent Calendarで紹介しますのでそちらをご覧ください。
Subsetのオプション
--target
以外のオプション --time
, --confidence
について説明します。
改めて --target
はインプットのテストの想定総実行時間のN%分を返すオプションになります。
--time
は 20m
, 120s
などインプットのテストの想定総実行時間から指定した時間に収まるようにテスト一覧を返すオプションになります。
--confidence
はconfidence curveを元に過去のテストの結果から失敗が含まれる可能性の割合から時間を算出するオプションになります。confidence curveについては別日のAdvent Calendarで紹介します。
さいごに
本日はPTSを利用するコマンド launchable subset
コマンドとそのオプションについて紹介しました。
7日目はコマンドの実行結果をlaunchableコマンド経由で確認する launchable inspect
コマンドについて紹介します。
Discussion