品質が良くなるか?本当に労力が少なくなるか?
よく、テストコードを書くと、本当に品質が良くなるのか、労力が減るのかという話になります。
お気づきだと思いますが、テストコードを書くというのは、それなりに時間と労力をかける必要があります。また、ブラウザの動作テストや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でのテストコードの記述方法を解説します。
