🌲
Cypressを実際のプロジェクト向けにセットアップしてみる
この記事でできること
- Cypressを使ってE2Eテストをセットアップができる
前回の記事
セットアップ手順
プロジェクト作成
-
空のプロジェクトを作成する
a. 任意のディレクトリを作成して移動cd ~/git/ && mkdir project && cd project
b. Cypressのインストール
npm install cypress --save-dev
c. (任意)package.jsonに以下を追記し、Cypressのコマンドをscript化する
package.json"scripts": { "cypress:open": "cypress open" }
d. cypressを開く
npm run cypress:open
e.
E2E Testing
->Start E2E Testing in Chrome
->New spec
->Create new empty spec
-> (一旦そのまま)Create spec
f. 以下のように勝手にディレクトリやconfigを追加してくれる
. ├── cypress │ ├── e2e │ │ └── spec.cy.js │ ├── fixtures │ │ └── example.json │ └── support │ ├── commands.js │ └── e2e.js ├── cypress.config.js ├── package-lock.json └── package.json
TypeScript化
- CypressはデフォルトだとJavaScriptですが、TypeScript化することで以下のメリットが得られます。
- 型安全性が高い
- エディタ上で補完が効く
補完についてイメージがつかない場合、以降のイメージを参照いただければと思います。
以下はデフォルトのJavaScriptを用いている状況で、cy.
と打った後、visit
とかは候補に上がりますが、get
とかは候補に上がりません。
インストール
npm install --save-dev typescript
セットアップ
-
tsconfig.json
をリポジトリの直下に作成
touch tsconfig.json
- 内容を一旦公式docに合わせて修正
tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": ["es5", "dom"],
"types": ["cypress", "node"]
},
"include": ["**/*.ts"]
}
- リポジトリ内の
.js
を全て.ts
に変更する- 変更対象が合っているか確認
find . -name "*.js" -not -path "./node_modules/*" | sed -e s/\.js// | awk '{print $1 ".js " $1 ".ts"}'
- 大丈夫そうなら更新
find . -name "*.js" -not -path "./node_modules/*" | sed -e s/\.js// | awk '{print $1 ".js " $1 ".ts"}' |xargs -n 2 mv
- 開き直すと、この時点で補完が効くようになる
型安全なカスタムコマンドのお試し実装
- ひとまず型定義ファイルを、
cypress/support/helpers.d.ts
として作成し、以下のような定義を追加する
cypress/support/helpers.d.ts
declare namespace Cypress {
interface Chainable {
getByTestKey(value: string): Chainable<JQuery<HTMLElement>>;
}
}
-
cypress/support/helpers.ts
というファイルを作成し、以下のようなコマンドを追加する
cypress/support/helpers.ts
import "./helpers.d";
Cypress.Commands.add("getByTestKey", (value) => {
return cy.get(`[test-key=${value}]`);
});
-
tsconfig.jsonで
**/*.ts
と.ts
ファイルを全てincludeされるようになっているので、2の時点でエディタ補完が効く形で利用ができる
-
型定義があるので、引数はstring以外受け付けない形となる
-
お試し実装の紹介なので、一旦追加したファイルは削除する
rm -f cypress/support/helpers.*
baseUrlの設定
-
visit
でページを表示する場合、以下のように書くのはアンチパターンと公式で紹介されています。
cy.visit('http://localhost:8080/index.html')
- baseUrlを設定することで、以下のように省略することが可能です。これにより、テストコード上で、FQDN(Fully Qualified Domain Name)を意識する必要性がなくなります。
cy.visit('index.html')
-
cypress.config.ts
にbaseUrl
を追記
cypress.config.ts
const { defineConfig } = require("cypress");
module.exports = defineConfig({
e2e: {
setupNodeEvents(on, config) {
// implement node event listeners here
},
baseUrl: "http://localhost:8484",
},
});
ついでにconfigを追加する(任意)
- 個人的に設定しておいた方が良さそうなものを紹介させていただきます
- Screenshot関連
-
screenshotsFolder
(スクリーンショットの保存ディレクトリパス)
→ デフォルト設定だと若干煩雑に置かれるので、実行結果としてのディレクトリを切ってそこの中で管理したいため
-
- Video関連
-
videosFolder
(録画ムービーの保存ディレクトリパス)
→screenshotsFolder
と同様の理由 -
videoCompression
(圧縮設定(0〜51))
→ 小さいに越したことないため
-
cypress.config.ts
const { defineConfig } = require("cypress");
module.exports = defineConfig({
e2e: {
setupNodeEvents(on, config) {
// implement node event listeners here
},
baseUrl: "http://localhost:8484",
screenshotsFolder: "cypress/results/screenshots",
videosFolder: "cypress/results/videos",
videoCompression: 15,
},
});
Discussion