SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

JavaScriptでテストを書こう!

なぜJavaScriptでテストコードを書くのか?

JavaScriptでテストを書こう! 第1回

品質が良くなるか?本当に労力が少なくなるか?

 よく、テストコードを書くと、本当に品質が良くなるのか、労力が減るのかという話になります。

 お気づきだと思いますが、テストコードを書くというのは、それなりに時間と労力をかける必要があります。また、ブラウザの動作テストやUIの確認などを含めると、少なくはなりますが手動テストのすべてをなくすことはできません。そう考えると、費用(労力)対効果を考えると本当にテストコードを書いたほうが良いかどうかという議論になります。

 確かに、作ったまま数年に1度しか変更をしないようなシステムであれば、テストコードを書かずに手動で最後にテストをしても問題ない場合があります。ただ、現在多くのシステムやサービスは、たとえウォータフォールモデルで開発していても、開発中やリリース後の変更は避けられないのではないでしょうか。もし仕様変更をスピード感を持って実行できるということになれば、お客様へ提供できる価値の一つになります。

 また、システムは複雑化、大規模化してきています。多くの人数で開発するプロダクトは、設計も可読性も良くしておかないと、時間と共に保守が困難になっていきます。そういう意味で、テストコードが現在記述されているメソッドに関して品質を保証し、仕様がテストコードに表現してあるのであれば、例え新しいメンバーでも変更がしやすいと言えます。

 つまり、「テストコードは手動テストの代わり」という考え方ではなく、変化に適応するためには「品質を作り込む」ことを目的にテストコードを書く必要があるということです。そのような考え方の転換が、総合的に設計の改善や手動テスト削減という効果を生むことにつながっていきます。

 開発当初、テストコードを書き始めても、なかなか効果が出ず、労力ばかりかかっているように見えますが、その「損益分岐点」は意外に早く来ます。特に当初「テストコードを書くのは大変だな」と思っても、辛抱して書くのが大切です。

テストコードの損益分岐点

JavaScriptでのテストの必要性

 ここまでテストを書く理由を説明して来ましたが、これらの背景はJavaScriptでも同様です。これには、JavaScriptの歴史的背景と、現状の環境が関係しています。

 20世紀終盤から21世紀にかけて、Netscapeが主流ブラウザの一つの頃は、ブラウザごとにJavaScriptエンジンの違いが大きかったり、実際バグがあったりなどで、どちらかというとJavaScriptはHTMLのおまけで、「JavaScriptはできるだけ使わないようにしよう」という考え方が主流でした。

 2005年にGoogle Mapsがリリースされ、Ajaxという言葉が注目を浴びると、JavaScriptが使われるようになりました。現在ではモダンブラウザを始め、スマートフォン、WebOS、サーバサイドJavaScriptなど、アプリケーションのすべてをJavaScriptで書くこともできるようになりました。同時に、JavaScriptで作るアプリケーションのコード量は増え、開発メンバーも増え、複雑化してきました。当然、HTMLのおまけのような扱いでJavaScriptを書いていくと、設計は煩雑になり、メンテナンス性も悪くなってしまいます。

 そこで、JavaScriptでもテストコードを書くことが重要になってきます。それは、JavaScriptのコードもより良い設計を目指すことであり、JavaやRubyのような一般的なプログラム言語と同様に書いていくということです。

JavaScriptテスティングフレームワーク

 JavaScriptでも、テストコードを記述することが可能になるよう、多くのテスティングフレームワークが用意されています。それぞれ、少しずつ特徴は違うものの、基本的にテストコードを実行するという意味で、大きな違いはありません。また、テストダブル(通常テストしにくいオブジェクトをモックやフェイクとして置き換える)を行うことができるライブラリや、クロスブラウザの自動テストを支援するライブラリなども提供されています。ライブラリの特徴をまとめると、以下のとおりです。

1)テスティングフレームワーク

 テストをサポートするフレームワークです。基本的なテストの記述方法を統一し、テスト結果を表示するなど、基本的なテストコードを記述するための機能をサポートしています。

2)アサーションモジュール

 テストを行う処理が、想定通りに動いているかどうか確認するためのモジュールです。想定外の動作の場合は、Exceptionが発生し、テスティングフレームワークに対してエラーを知らせます。

3)テストダブルライブラリー

 テストを動かす際に、サーバサイドAPIとのやり取りを行うAjax処理を動かすと、サーバサイドもテストを想定して揃えておく必要があり、テストのハードルが上がってしまいます。そこで、テストダブルライブラリーを使うと、Ajaxオブジェクトをスタブオブジェクトに置き換え、テストを行うことが可能です。Ajax以外に、呼び出す先の関数やオブジェクトを置き換えたり、時間を仮想的に進めたりすることができます。

4)クロスブラウザ自動テストライブラリ

 JavaScriptは、複数のブラウザで動作するため、クロスブラウザのテストを行う必要があります。手動で行うと時間がかかるため、自動的にテストコードを実行するライブラリーが提供されています。テストサーバを起動し、テストを行うブラウザを接続し、サーバサイドのコマンドでテストを実行すると、接続ブラウザでテストが実行され、結果がサーバに返ってきます。

 次回以降、それぞれの使用方法を解説していきます。

まとめ

 最後に、ここまでお話してきた内容をまとめます。

  • 変化に適応するためにテストコードを書く
  • テストを書くということは設計である
  • ビルドと組み合わせよう
  • 「品質を作り込む」という考え方への転換
  • JavaScriptにも多くのテストライブラリが用意されている

 今回は、テストコードを書くということだけではなく、考え方の転換が重要というお話をしました。次回は、具体的にJavaScriptでのテストコードの記述方法を解説します。

修正履歴

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
JavaScriptでテストを書こう!連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 安西剛(ヤスニシ ツヨシ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7257 2013/07/25 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー