🚀

Launchable Advent Calendar 6日目 - subset command

2022/12/06に公開約4,500字

Launchableの各機能の利用方法を紹介する Launchable Advent Calendar 6日目です。

はじめに

6日目はPredictive Test Selection(以降PTS)を利用するためのコマンド launchable subset コマンドについて紹介します。

改めてざっくりPTSについて説明します。

タイポを修正するPRだとしても全てのテストを実行して問題が無いことを確認してからベースのブランチへマージする。

のように全てのテストを都度実行するのではなく修正に関連するテストを効率良くテスト出来たらと思ったことはありませんか?

過去のテスト結果や修正されたファイルの情報を元に機械学習により学習モデルを生成し、テスト時にテスト対象を失敗しやすいであろう順に学習モデルを利用して並び替え/選択するのがLaunchableの提供するPTSになります。
(※PTSは有償サービスになります。link)

overview

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%分のみをテストするようになりました。

ci.yaml
         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()

サンプルPR

成功すると全部で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%分を返すオプションになります。
--time20m, 120s などインプットのテストの想定総実行時間から指定した時間に収まるようにテスト一覧を返すオプションになります。
--confidence はconfidence curveを元に過去のテストの結果から失敗が含まれる可能性の割合から時間を算出するオプションになります。confidence curveについては別日のAdvent Calendarで紹介します。

さいごに

本日はPTSを利用するコマンド launchable subset コマンドとそのオプションについて紹介しました。
7日目はコマンドの実行結果をlaunchableコマンド経由で確認する launchable inspect コマンドについて紹介します。

Discussion

ログインするとコメントできます