自動化されたテストのある開発風景

ユニットテストと自動化されたテスト

ユニットテストは、クラスやメソッド、関数などを対象としたプログラムを検証するためのテストで、ソフトウェアテストの中では最も小さい粒度のテストです。

ユニットテストを行う目的として、表向きはソフトウェアの品質を高めることがあります。しかし、その真の目的は対象のクラスやメソッドの仕様を日本語のような自然言語ではなく、動くプログラムとして記述することにより、仕様を明確にし、その仕様を保証することにあります。

また、プログラムとして記述したテストを繰り返し何度も実行することで、製品側のプログラムに問題が発生したときに、早い段階で影響範囲などをチェックできることも重要なポイントです。

このように、ユニットテストはプログラムとして何度でも実行できる、⁠自動化されたテスト」であることが重要となります。

テストのコストをどう考えるか

しかし、ソフトウェア開発の現場で自動化されたテスト(を実現するテスティングフレームワーク)が導入されている割合は決して高くありません。

テストを自動化するには、当然ながら最初にテストコードを記述する必要がありますし、そのためにテスティングフレームワークの使い方を習得する必要もあります。このため、開発するソフトウェアが小規模かつ一度きりのリリースしか見込まれていない場合には、導入コストに見合わない、手作業でやったほうが早い、と判断されがちです。

しかし、将来的にソフトウェア開発を続けていくのであれば、習得コストはいずれ何らかの形で消化する必要があります。そして、一度消化すればそれ以降のコストは下がります。

テストコードを記述するコストにしても最初だけで、2回目以降はほぼノーコストで実行できるため、テストを繰り返し実行すればするほど1回あたりのコストは下がります。

WebサービスやWebアプリケーションの開発現場では、日々コードに改変が加えられ、毎週のようにリリースを控えています。このような開発サイクルでテストを手動で実行していてはきりがありません。このため、テストの自動化に対する取り組みにも積極的です。

継続的な開発に不可欠なテストの自動化

自動化されたテストの最大のメリットは、コードに変更を加えるたびに気軽にテストを実行し、常に動作するきれいなコードを手にできることにあります。

機能の追加や削除を行う際にはリグレッション(変更を加えた際に、その機能とは別の部分で不具合が発生すること)の不安が付きまとうものですが、テストが備わっていればその不安は最小限に抑えられます。

すなわち、正式リリース済みの動作するコードに対しても積極的に手を入れ、機能拡張やコードの修正を安心して行うことができるのです。

JUnitを通じて自動化されたテストのメリットを解説する『JUnit実践入門』

JUnitは、Javaの自動化されたテストを実現する代表的なテスティングフレームワークです。⁠JUnit実践入門』では、JUnit自体のテストの使い方や拡張についてはもちろんのこと、自動化されたテストを最大限活用するための継続的なテスト環境の構築や、テスト駆動開発などの開発手法について、JUnitを題材に紹介しています。もし、本稿を通じてテストの自動化に興味が湧いたのであれば、ぜひ書店で本書を手に取ってみてください。