Cypress クラッシュ問題の解消

こんにちは。最近はCypressの回しすぎでテストエンジニアのようになってきたフロントエンジニアです。今回はCypressで大量のテストを回すと、ブラウザがクラッシュする問題の検証と解決を行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365717/72423a33-71ce-5b22-5974-11778f0febea.png)

## ■結論
最初に結論から述べると、テストを回すブラウザを「FireFox」にしたら解決しました。

## ■原因の追及
今回行ったテストは15ページ程に及ぶWebサイトのE2Eテストを通して行うというものでした。これを回すと途中でエラー画面になってしまい、テストが止まってしまいます。


こちらの記事にChrome Error 00005が起こる原因がまとめられています。

https://www.solvusoft.com/ja/errors/%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0-%E3%82%A8%E3%83%A9%E3%83%BC/google-inc/google-chrome/5-chrome-error-00005


またこちらの[stackoverflow](https://stackoverflow.com/questions/51630143/cypress-long-automation-script-crashes-the-chrome-browser-with-aw-snap-error "Cypress long automation script crashes the Chrome browser with Aw Snap Error")の回答でも、今回の問題についてまとめられていました。

>cypress openで実行する場合、Cypress はデバッグ目的で通常の DOM スナップショットを取得します。これにより最終的にクラッシュするまで、メモリは増加し続けます。

これらにより、原因はメモリ消費量なのではないかと突き止めました。

## ■色々やってみる
### ❌①Chromeを最新バージョンにしてみた。
> Google Inc.ファイルの最新バージョンをダウンロードしてインストールすることで解決できます

先ほどの記事を参考に、Chromeをバージョンアップしてみました。
→ 解決せず。

### ❌②numTestsKeptInMemoryを0にしてみた。

[GitHabのIssues:「(直訳)250秒（約）以上のテスト実行時に「Aw, Snap」エラー画面が表示される 断続的」](https://github.com/cypress-io/cypress/issues/1906 "Aw, Snap' error screen shown when test runs over 250 seconds (approx) intermittant")を参考に、`cypress.config`ファイルに下記設定を追加しました。

```javascript:cypress.config.ts
export default defineConfig({
  ...
  "numTestsKeptInMemory": 0, //追加
  ...
  },
})
```

参考： [Cypress.configの引数一覧](https://docs.cypress.io/guides/references/configuration#Options "Configuration")
>numTestsKeptInMemory:
スナップショットとコマンド データがメモリに保持されるテストの数。テスト実行中にブラウザで大量のメモリ消費が発生している場合は、この数値を減らしてください。

これで解決している人も多いようですが、私はダメでした。。
同じIssuesの中でこのような一文もありました。

>私たちの多くがこのスレッドで以前に指摘したように、numTestsKeptInMemory はマイナーな可能な回避策にすぎません..

冒頭に挙げた[stackoverflow](https://stackoverflow.com/questions/51630143/cypress-long-automation-script-crashes-the-chrome-browser-with-aw-snap-error "Cypress long automation script crashes the Chrome browser with Aw Snap Error")では下記のように述べられています。

>メモリに保持されるスナップショットの数を減らすことができます。
numTestsKeptInMemoryデフォルトは 30 程度ですが、10、5、または 0 に減らすこともできます。0 の場合、DOM スナップショットは取得されません。メモリ使用量は引き続き増加しますが、速度ははるかに遅くなります。

スナップショットが取得されなくなるので、あまりいい方法ではなさそうです。

### ❌③テストを回すChromeのバージョンを変える

続いて試したのがこちらです。どうやらChromeの100以上のバージョンがダメ、という事でCypress起動コマンドを変更し、テストを回すChromeのバージョンを変えてみました。ただ実際に回しているバージョンが変わっていたのかよく分からず。。やり方が根本的に間違えていたかもしれません。

[GitHub Issues:「(直訳)Cypress Open が Chrome 100 へのアップグレード後に「Aw Snap」で Chrome をクラッシュさせる」](https://github.com/cypress-io/cypress/issues/21135 "Cypress Open Crashing Chrome with Aw Snap after upgrade to Chrome 100")

```
npm run cypress --browser "pathToChromiumVersion\chrome.exe"
```

### ❌④ログを出力しないようにして軽くする
続いてこちらを試しました。
[参照：Cypress Troubleshooting](https://docs.cypress.io/guides/references/troubleshooting#Log-memory-and-CPU-usage "Troubleshooting")

起動コマンドを叩く際に、下記一文を追加して叩くとログが出なくなるようです。

```
CYPRESS_NO_COMMAND_LOG=1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365717/872ee703-4100-f453-f6aa-7d527a28962c.png)


画面に何も表示されなくなりました。サイトを立ち上げているターミナルではアクセスのログが吐かれていたので、恐らく動いているようですがこれではテストの結果もよく分からないので実用的ではなさそうです。

## ■解決
調べている内にGitHubに同じようなIssuesが複数立てられており、どこでも解決していないことが判明し諦めかけていました。ただここで皆さんが同じような問題を抱えている事に気が付きました。
「Chromeでクラッシュする」
「Edgeでもクラッシュする」
…
ブラウザを変えたら解決するのでは？

### ⭕️FireFoxで回してみた
試しにFireFoxで回してみたところ、クラッシュせずに回すことが出来ました！！
FireFoxはメモリ使用量を抑える特性を持っているようです。すばらしい

https://www.mozilla.org/ja/firefox/features/memory/#:~:text=Chrome%20%E3%81%AF%E3%80%81Firefox%20%E3%81%AB%E6%AF%94%E3%81%B9,%E3%83%A1%E3%83%A2%E3%83%AA%E5%AE%B9%E9%87%8F%E3%81%8C%E5%A2%97%E3%81%88%E3%81%BE%E3%81%99%E3%80%82

…ここで、もう１つGitHubでよく述べられていたコメントに気が付きました。
<font color="tomato">「テストを細かく分割せよ」</font>
…これが恐らく最適解です。

## ■まとめ
今回はCypressで大量のテストを通して回すと、ブラウザがクラッシュする問題の検証を行いました。結果としては現在も議論が行われており、明確な解決方法は出されていないようでした。ひとまず

:::note
・メモリの消費量が少ないFireFoxを使う
・テストを分割して回すこと
:::

が対応策になるみたいです。様々なブラウザで全て通してテストをしたい場合はちょっと不便かもしれないですね。。

お読みいただきありがとうございました。