Cypressのデメリットとは?
Cypressとは、モダンWebのために構築された、無料でオープンソースのJavaScriptで作られたフロントエンドE2Eテストフレームワークのことです。Mochaが基盤になっているため、非同期テストが簡単かつ便利に行えます。ReactやVue.js、AngularなどのWebフレームワークに広く使われているほか、Cucumberと併用するように設定することも可能です。
Cypressについて知っておきたい重要ポイントは、Seleniumベースではないことです。これにより、ブラウザのDOM要素に対してうまく動作します。Seleniumベースのツールと比べ、Cypressのほうが高速で(※)、堅牢性と信頼性が高いことも知られています。NPMコマンドを実行するだけでインストールできるため、オンボーディングも簡単です。
Q4 Inc.で自動化エンジニアを務めるチャステイン・マルチルドン氏は、インタビューで次のように話しています。「ソフトウェアテストの世界において、ほとんどの開発者とQA担当者はSeleniumなどのツールでコードを書いたり、Cypressでテストスクリプトを実行したりすることに慣れています。ソフトウェアが成長・変化するにつれてスクリプトも増え、メンテナンスがかなり大変になってしまいます。これでは開発に時間がかかり、『継続的にリリースして開発ライフサイクルの短縮を目指そう』というDevOpsの原則に反してしまうのです。」
マネーフォワードケッサイ株式会社の取締役CTO、篠原祐貴さんはチームメンバーと品質保証に取り組んだ体験について、次のように述べました。「生産性の話でフロントエンドという領域は、なかなかイテレーションに組み込むことが難しいと思うんですね。Cypress等を利用して、E2Eテストをコードで管理する会社もあると思いますが、コードが壊れてイテレーションのブロック要素になってしまうこともあり得ます。なので、E2Eテストには僕たちもあまり取り組めていなかったんです。デプロイ後に最低限、自分たちで動作確認していました。」
開発者たちは、Cypressのデメリットに対して不満を抱いているわけです。本記事では、Cypressのデメリットとその回避策について探っていきます。
Cypressのデメリットとは
Cypressには根本的なデメリットがいくつかあり、本格的なテスト自動化には向きません。テストの読み込みから実行まで、Cypressには技術的な限界があることが知られています。ここでは、Cypressのデメリットについて考察していきます。
1. JavaScriptでテストを書かなければならない
JavaScriptは世界で最も有名なプログラミング言語であり、CypressがNode.JSしか使えないのは驚きではありません。しかし、Node.JSは、PromisesやjQuery、非同期JSなど、JavaScriptに関する高度な知識が必要となるため、テスト自動化には向きません。
JavaScript Promiseとは、JavaScriptにおける非同期プログラミングモデルのことで、JSの基礎知識がなければ難易度が高いものです。自動テストを行う際、JavaScript Promiseは混乱の原因となることが知られています。
Seleniumとは違い、Cypressでは幅広いプログラミング言語を使うわけではありませんが、テスト自動化エンジニアはJavaScriptでコードを記述しなければなりません。つまり、QAテスト担当者がJavaScriptの書き方を知らない場合、JavaScriptを学ばない限り作業ができないわけです。一方、Autifyはノーコードのテスト自動化ツールなので、マウス操作ができれば使えます。
JavaScriptの制限により、package.jsonファイル内のNPMパッケージをすべてインストールしなければなりません。ほかのNPMフレームワークと同様ですね。Cypressフレームワークに関連する依存関係を管理できるようになります。この作業を行うのはアプリケーションの動作のためですが、自動テストには理にかないません。正しい依存関係がインストールされていなければ、Mochaテストを実行中にエラーが発生することがあります。
また、node_moduleフォルダの容量はかなり大きいため、自動テストの実行速度が制限されてしまいます。
2. 複数のタブに対応していない
Cypressはブラウザ内で動作するので、テスト実行時に複数のタブをサポートできません。しかし、Q4 Inc.の自動化エンジニア、チャステイン・マルチルドン氏は回避策があると言います。「CypressからAutifyに移行してから、Autifyにはボトルネックとなるようなものはほとんど見つかっていません。Virtual Eventsでは、ユーザー間のやり取りをシミュレーションするために、複数のタブを開けなければなりません。Cypressでも対処できますが、そのための時間的余裕はありませんでした。Autifyのほうが、新しいタブを開くのが簡単だったのです。作業効率が飛躍的に向上しました。一度Autifyを体験したら、他のツールを使うことは考えられませんね。」
3. ※ Cypressのほうが遅い
Cypressのテスト実行速度は初期段階では問題ありません。デモには適しているかもしれませんが、アプリがスケールするにつれて遅くなってしまいます。Cypressは、Chromiumベースブラウザ内でデバッグを有効にするために開発されたプロトコル、Chrome DevTools Protocol(CDP)だけをベースとしています。
かなり小規模なテストスイートの場合、Cypressのテスト実行はSelenium WebDriverとほぼ同じか、それよりわずかに遅いことが分かっています。中規模または大規模なテストスイートであれば、著しく遅くなってしまいます。Cypressでテスト自動化し続けるのは非効率であり、困難です。
4. メンテナンス
ほかの業界も同じですが、品質保証・テスト自動化業界でも、テスト自動化エンジニアの視点は新米とベテランで大きく異なります。業界標準のUIテストには、専門家が知っておくべきルールや仕様があります。
アプリケーションが成長するにつれてテストは高速で行われ、多くの場合、実行されるのは大規模な自動UIテストです。Cypressでは、メンテナンスが行き届かないことが多いことが分かっています。Cypressにおいて、メンテナンスよりテスト作成のほうが圧倒的に簡単なのです。きちんと自動テストを行うには、アプリケーションが頻繁に変更されてもリアルタイムでメンテナンスしなければなりません。
自動テストを成功させるには、使いやすさが肝心です。プログラマーだけでなくチームメンバーも使う技術ですし、テスト作成よりメンテナンスがあまりにも難しいと、どこかでバランスが崩れてしまいます。
自動テストの実行よりも、改善やメンテナンスに労力を割かなければならないため、Cypressだけで自動テストを行うのは厳しいと言えます。
5. 構文が複雑で一貫しない
Cypressを推す人は「Cypressは構文が良い」と言いますが、実際にさまざまなシナリオやプロダクトで試してきた経験からすると、Cypressのシンタックスはかなり劣っています。
Cypressの構文には曖昧なところがあるため、使いにくく、理解しにくいのです。ほかのテストフレームワークと比べ、JavaScriptにのみ依存しているCypressは難易度が何倍も高く感じられます。非同期プログラミングは難しいプロセスで、自動テストと組み合わせる場合、通常は多くの犠牲が生まれてしまいます。ですから、ソフトウェア開発ライフサイクル(SDLC)におけるエンジニア以外の関係者はテスト作業に参加できません。
Cypressのデメリットを解決する方法は?
調査によると、DevOpsのQAチームは自動テストプロセスに乗り気ではなく、いつもより良いソフトウェアを常に探し続けているそうです。当然ながら、テスト自動化ツールを選ぶ際は長所と短所だけでなく、ツールについてさまざまなことを確認しなければなりません。
Cypressを選ぶ場合、PoC(Proof of Concept:概念実証)が必要なこともあります。これにも時間がかかり、ツール選びが長引いてしまいます。
Cypressの代替としてユーザーに選ばれるAutify
Autifyはデスクトップアプリの検証には対応していないものの、ウェブアプリとモバイルアプリのテスト自動化にはCypressより断然優れています。Autifyは、AI型ノーコードテスト自動化プラットフォームなので、特定のプログラミング言語でコーディングする必要は一切なく、だれでもテストスクリプトを作成できます。
Autifyのメリットの1つは、非エンジニアは特別な研修を受けずにテストスクリプトを作れること。スケールやメンテナンスが必要な場合も、AIが自動的にテストスクリプトのメンテナンスを行います。AutifyのアルゴリズムがUIの変更を追跡し、変更内容をスケールし、大規模なアプリに対してテストスクリプトとシナリオを実行します。Autifyなら、「アプリが拡張するとテストが壊れる、失敗する」という状況を避けつつ、すべてのテストを実行できるわけです。
貴重な時間とリソースを節約できるのはもちろん、チームは最も大切なこと(プロダクト開発)に集中できます。Autifyはクロスブラウザテストにも対応しているほか、SlackやJenkinsなどとの連携も可能です。
Autifyはデフォルトでレポート機能が有効になっており、テストプロセスに関する大切な情報を把握できます。
まとめ
Cypressは自動化に役立つツールになり得ますが、メリットよりデメリットの方が多いため、成長中のアプリに使うのは厳しいでしょう。Cypressに限界を感じている方は、おすすめの代替ツールをお試しください。
Autifyではこの他にも品質保証やテスト、アジャイル開発に役立つ資料を無料で公開していますので、ぜひこちらからご覧ください。