Cypressが動かなくなった

CypressによるローカルでのE2Eテストが動かなくなった。何もしていないのに(しばらくブログ書いていなかった)。 結果的に対処できたが、「結論」と「多少の試行錯誤」についてまとめてみた。
Cypress runが動かなくなった
以下のような現象が発生した
start-server-and-test
を利用したcypress run
ですべてのテストがタイムアウトする- serverもcypressも動いているがテストがすべてタイムアウトする
結論
以下のとおり更新したら動くようになった。
- cypress 7.7 → 9.5にupdate
- start-server-and-test 1.12 → 1.14にupdate
- 必要に応じて
package-lock.json
とnode_modules
を削除
実施したこと
仮設1: リクエストに時間がかかっている
cypressのテストがタイムアウトするので、まず考えられたのがserverが起動する前にcypressが動いてしまっているケース。 調べた結果、cypressを待たせる対処法が散見された。以下はいろいろなケースに対処する方法がまとめられている。
ただ、defaultCommandTimeout
値を変えても改善されなかった。原因の可能性は低いと判断して次の仮設を考える。
仮設2: start-server-and-test側の問題
start-server-and-testの設定の問題だと考えた。 調べてみると、start-server-and-testを使っていれば大きな問題はなさそうなのがわかった。ただ、webpack-dev-serverを使っている場合は別途対応が必要。 私のE2E構成については「HugoのE2EをCypressでやってみた - gorou-style」を参照。
ちなみにwebpack-dev-serverを利用している場合は以下が参考になると思う。
仮設3: packageのversion up
しばらくnodeおよびnpmのメンテをしていなかったので、依存関係によって動かなくなったケースだと考えた。 まず利用しているパッケージを何も考えずに最新に更新した。
もともと、cypress 7.4を利用していたのだがnodeの依存がv14以上(正確には=>14.16.0)だったため、安全側に倒してv14を利用していた。
cypress 9系では、nodeの依存がv16以上(正確には=>16.5.0)。プロジェクトの .node-version
の変更も実施。
最終的に以下の変更を実施した
"devDependencies": {
- "cypress": "^7.4",
- "start-server-and-test": "^1.12"
+ "cypress": "^9.5",
+ "start-server-and-test": "^1.14"
}
しかし、これだけでは動いたり動かなかったりしたが、package-lock.json
とnode_modules
の削除でキレイに動くようになった。キャッシュが影響していたようだ。
まとめ
しばらくブログを書かず久々にCIを動かしたところ、ローカルのE2Eテストが全滅していて驚いた。各パッケージを最新にすることで沼にはまらず解決できて助かった。 cypressとstart-server-and-testのreleaseをざっと眺めてみたが、原因になりそうな情報は見つけられなかったのが残念(根本原因不明)。
npmパッケージは頻繁にバージョンが上がっていくので(node自体も)、定期的にチェックして上げていきたい(自動化できるとなお良さそう)。
駄文
サンプルアプリケーションを書いていて、利用しているライブラリのリポジトリを見ていたらコントリビューションできそうな箇所を発見したので初コントリビューションしてみた。
対象のリポジトリは、コントリビューションのドキュメントがとてもしっかりしていたため、そこまで悩まずに(全部英語なので苦戦はしたが)Pull Requestを出せた。数時間くらいでチェックされすぐにマージされ、表現に困るがとても嬉しかった!