❄️

vitestのflakyテストをgithub actionsではたまに実行するようにする

に公開

vitestでコケがちなflakyテストに対して、「捨てたくもないし存在は忘れたくないけど毎回コケると困る」みたいにする方法を考えた

vitestの標準機能

残念ながら、vitestにおいて、tagのような機能は予定されてないようだった

そのため自前でどうにか管理する必要が出てきた

どうするか?

下記3つがありそう

  • A. @flakyのようにテスト名にマーキングする
  • B. runIfを加工してflakyにする
  • C. Foo.flaky.test.tsのようにファイルを分ける

Aの場合、特定のキーワードを無視するというのが若干複雑そうだったので除外した。

"test:flaky": --testNamePattern="^(?!.*\@flaky).*$"
"test:stable": --testNamePattern="@flaky"

Bの場合は下記のような具合。ただこれだと「flakyを除外して実行」を考えるとちょっと厄介な部分が多く諦めた

const runFlaky = () => process.env.RUN_FLAKY_TEST
export const flakyTest = test.runIf(runFlaky())

flakyTest("....")

Cの場合は単にファイル名なので下記のような具合。
flakyな部分を別ファイルに切り出す面倒さはあるものの、管理のわかりやすさなど考えるとこれが一番良さそうだった。

"test:flaky": "vitest run flaky.test.ts",
"test:stable": "vitest run --exclude '**/*.flaky.test.ts'",

github acitonの設定

あとはこれをgithub actionsでたまに実行されるようにする。

- run: npm run test:stable
  name: Run stable tests
- id: decide_flaky
  run: echo "should_run=$(( $RANDOM % 10 < 2 ))" >> $GITHUB_OUTPUT
- run: npm run test:flaky
  name: Run flaky tests
  if: steps.decide_flaky.outputs.should_run == '1'

ワンライナーでやりたいところだったが、ちょっと難しそうなので、一回変数を格納してそれを利用する感じに落ち着いた

GitHubで編集を提案

Discussion