1. HOME
  2. Blog
  3. Development
  4. 次世代e2eテストツールCypress

次世代 e2eテストツールCypressをAngularプロジェクトに導入

Cypressは銀の弾丸となり得るか

はじめに

Angularプロジェクトのe2eテストツールとしてCypressを導入することになりました.そこでCypressについて紹介したいと思います.
Cypressの強みは他を圧倒する導入コスト, 学習コストの低さです.
また, 多くのe2eテストツールはSeleniumをベースとしていますが, Cypressは独自のアーキテクチャを用いることによりいくつかの既存の問題を解決しています.

従来のテストでは, 以下の手順を踏む必要がありました.
1. frameworkを選ぶ()
2. assertionライブラリを選ぶ
3. Seleniumをインストール
4. Seleniumのラッパーを選ぶ
5. (追加ライブラリのインストール)

cypressなら?
1. cypressをインストールする

Seleniumを用いた従来のe2eテストでは事前にフレームワーク, ライブラリの選定をする必要がありましたが, Cypressは全部乗せよくばりセットなのでこれ一つで完結します.
また, Cypressは汎用ツールとしてではなくテストツールに特化して開発されているため, Seleniumと比べ, より高速に動作します.

既存ツールと比較して秀でている点

Cypressには, Cypress Test Runnerというインタラクティブにテストを実行できるGUIツールがあり,
このツールを利用することで, エンジニアはテストコードを書くことに専念することができます.

Why Cypress?

次のように、便利機能が豊富なので再現性の低いバグを再現する作業にも役立つのではないでしょうか.

  • Chrome Developer ToolsライクなUI
  • デバッグを容易にする各種メソッド
  • 要素を選択するためのクエリをクリックで検出
  • コードのwatch, ブラウザのホットリロード
  • リクエストごとにDOM要素のスナップショットを保存


他にも, 簡単にスタブを作成する, 要素が呼ばれたか監視するなどの便利なメソッドが目白押しです
Stubs, Spies, and Clocks

案ずるより産むが易し

ということで, どれだけ簡単に試せるのか体験していきましょう.

システム要件
> Mac OS 10.9+ (Mavericks+), only 64bit binaries are provided for macOS.
> Linux Ubuntu 12.04+, Fedora 21, Debian 8, 64-bit binaries
> Windows 7+, only 32bit binaries are provided for Windows.

また, node.js及びnpmも必須ですので予めご用意願います.

終わりです.

たった数コマンドでCypress実行環境のインストール, scaffoldの生成までよしなにしてくれます.
生成されたscaffoldは次のようなディレクトリ構成です.

cypress/integration 配下に配置したファイルにテストコードを記述します.
上記のディレクトリ構成では, cypress/integration/my_spec.js にあたります. (おそらくもっとたくさんのexampleファイルが生成されていますが適宜読み替えてください.)

cypress open コマンドによって立ち上がったGUI上からテストの実行ができます.

null

試しに, 適当なテストコードを実行してみましょう.
ファイル名をクリックすることでテストが実行されます.

null

cypressのデモサイトに対してテストが実行されるのが確認できるかと思います.
これだけでは面白くないので, ざっくりコード例を見ていきます.

my-spec.ts

Protractorなど, 別のテストツールを使ったことがある方には説明不要なほど可読性が高いと思います.そうでない方でも, だいたい何をしているか分かるのではないでしょうか.
上のコードはログイン機能のテストを行っています.具体的には, cy.get()でDOM要素の選択, click()やtype()で各種操作, should()でassertなどの処理をしています.

Introduction to Cypress

cypressによって作成されたexampleコードはJavaScriptですが, TypeScriptをサポートしているため特別な設定なしにcypress/integrationディレクトリに配置するだけで動作するのもGoodです.

CIのお供に

勿論, CUIも用意されています.

CUIで実行すると, headlessモードでテストが走ります.
実行後, cypress/videos 配下に動作画面のキャプチャをmp4で出力してくれるのも気が利くところです(実行オプションで無効にもできます)

CIなど, 画面のない環境で動かそうとすると, いくつかのソフトウェアを導入する必要があるのですが, Dockerイメージが公開されているのでそちらを使うのがオススメです.
cypress/base

使ってみて

ほしいな〜と思った機能は調べればだいたい実装されています.
プラグインの開発も活発なようですし, 自作してしまうのもよいかもしれません.
Plugins

なにより嬉しかったのは公式ドキュメントが豊富なことです.
案ずるのも産むのも, 楽であればあるほど良いです.

本稿ではe2eテストツールとして提供されている Cypress Test Runner のご紹介をしましたが, 

テスト結果の記録管理を行う有償Webサービスの Cypress Dashboard Service も提供されています.
テストコードの並列実行が可能だったり, テスト結果のグルーピングができたりと, 企業向けの機能の力を入れているようです.

機会があればまた少し触れてみた感想をまとめてみたいと思います. 
ありがとうございました.

銀の弾丸たりえたのか?

実は, Cypressはクロスブラウザ未対応です.現状ではChromium, Chrome, Chrome Canary, Electronにしか対応していません.
Roadmap
Roadmapを見ると対応予定はあるようですが, すぐには難しいでしょう.
クロスブラウザテストを必要とされる場面では, 従来どおりSeleniumを使うのがよさそうです.