開発者が適切なテストを行うために
はじめに
従来の多くの場合、ソフトウェア開発におけるテストは「専任のテストエンジニアが実施するもので、開発者が行うことではない」というものでした。しかし最近では状況が変わってきており、開発者がテストを行うことも増えてきました。そこで、本連載では、開発者がテストを適切に行うための知識や技術などについて解説していきます。
開発者にとってテストを学ぶ必要性とは
第1回の今回は、そもそものテストの概要や開発者がテストを行うようになってきた背景、テストの価値について解説し、開発者もテストを学ぶ必要性があることを示します。
テストにまつわる状況
最近、利用者ニーズ自体が多様化してきたことに伴い、ソフトウェアへの要求が捉えにくいものとなってきています。また、ソフトウェアへの要求自体が頻繁に変わりやすくなってきており、ある時点での要求を満たすソフトウェアを開発しても、ソフトウェアが満たす要求の多くはすぐに陳腐化し、ソフトウェアとしては価値の低いものとなりがちです。
このようなソフトウェアを取り巻く環境の変化により、ソフトウェア開発の方法にも変化が起きています。小単位での素早いリリースを実現するために、なるべく開発初期からのテスト実施が求められる状況になりつつあるのです。
また、テストを実施するためのツール群が一般的になり、開発者によるテストを実施するコストが下がってきています。加えて、クラウドサービスの登場やスマートフォンの成熟により、テストを行う環境のコストも下がり、開発者がテスト環境を容易に構築・利用できる状況になってきています。
これらの状況により、開発者がテストを行うニーズが高まるとともに、開発者がテストを行うコストも下がってきており、テストエンジニアだけがテストを実施するのではなく、開発者も実施するようになってきているのです。
テストの価値
1. 一般的な役割
テストの資格試験制度を運営するJSTQB認定の教科書である「JSTQB Foundation 第3版」では、テストが持つ一般的な役割を以下のように述べています。
システムが稼働する前にシステムやドキュメントを詳細にテストし、欠陥を検出して修正することで、市場で問題が発生するリスクを減らすこと
ここで挙げられる欠陥には、"仕様として定義したもののそれが実現されていない"ものである「欠陥」と、"仕様としてはそもそも想定していないが利用者によって利用に不都合な動き"である「欠陥」を含んでいますが、いずれにしても、テストはソフトウェアが市場で問題を発生するリスクを下げる役割を持っています。
このようにリスクを下げる役割を持つテストですが、その利用の仕方により、開発者を楽にさせることや開発を加速させることが可能となります。以下では、それらについて説明します。
2. 開発者を楽にするテスト
開発を行う際には、開発者は自分が開発しているものが既存のプログラムに悪影響を出していないか、不安を感じながら進めています。そんなときに、既存のプログラムへの悪影響が出ていないか、既存のプログラムの動作を確認するテストコードを頻繁に実行することで、悪影響の発生を即座にキャッチし、素早く修正していくことが可能となり、開発者としては精神的に楽に開発を続けられます。
例えば、開発を綱渡りとすると、テストは綱渡りにおけるセーフティネットのようなものです(図1)。開発におけるミスとは綱から落ちることであり、セーフティネットの目の細かさがテストの量のイメージです。綱から落ちたとしても目が細かいセーフティネットがあれば地面まで落ちることはないので、安心して綱を渡っていくことができます。すなわち、既存のプログラムへ悪影響を与えることなく、安心して開発を進めていくことができます。
ただし、目の粗いセーフティネットでは地面まで落下してしまう、すなわちテストがないもしくは少ない場合には容易に既存のプログラムへ悪影響を与える可能性があり、精神的に緊張しながら開発を進めることになります。
3. 開発を加速させるテスト
上記では、「テストコードを頻繁に実行することで、精神的に楽に開発を進められる」というテストの価値を説明しました。次に、「テストを開発のゴールとして利用すると、開発を加速できる」ことについて説明します。
一般的なソフトウェア開発の多くは、自然言語から開発者の解釈に基づいてプログラムを作り、完成したプログラムに対して実現したいことが満たせるかをテストして確認します。そして、失敗したテストがあれば、開発者の解釈と実現したいことをすり合わせ、解釈とともにプログラムを修正し、プログラムの完成を目指します。自然言語には人により解釈の幅があるため、開発者の解釈に基づいて作られたプログラムと本来実現したいことがずれ、その調整に時間を要することがあります。
一方、開発においてテストを利用する方法があります。はじめに実現したいことをテストもしくはテストコードとして用意し、その後プログラムを作りながら用意したテストを実行し、テストが成功するプログラムを作ります。このように開発においてテストを利用することで、解釈にずれを発生させず、プログラムの完成を容易かつ明確に判断できるため、開発を加速させていくことが可能になります。両者を比較すると、違いは図2のようになります。
例えると、一般的な開発ではある程度ゴールの方向に進んでから具体的なゴールを探して到達するイメージ(図3左)に対し、テストを利用する開発ではテストとして明確にゴールを定めた後に、そのゴールに向かって一直線に進んでゴールに到達するイメージ(図3右)となります。
以上のように、テストには一般的なリスク低減の価値だけではなく、利用方法によっては開発にも価値があります。世の中の状況変化だけでなく、それらテストの価値は開発者がテストを行うことの増加要因、ならびに開発者もテストを学ぶ必要性ある要因となっています。
おわりに
最近のソフトウェア開発では、開発者もテストを行うことが増え、開発者がテストを学ぶ必要性が増してきています。今回は、その背景やテストを利用したより良い開発について解説しました。次回以降は、「テストをうまく実施したい」と考えている開発者に向けて、具体的な知識や技術、方法論を紹介していきます。次回もお楽しみに!
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- ソフトウェアテストのスムーズな導入
- アジャイル開発の「構築フェーズ」で留意すべきポイント
- 構造を決定するテスト
- 「リグレッションテスト」でソフトウェア開発を効率的するための必須ポイント
- エンタープライズ・アジャイルのキモとなるスケーリング
- いろいろなプロセス ~V字モデルとスクラム~
- アジャイル開発の明暗を分ける時間軸の捉え方の違いとは
- テストは開発者から利用者視点へ
- 9/27開催「Open Source Summit」をはじめ、リアルイベントでのプロトコルを発表。11月までのKubeCon + CloudNativeConなどにも適用、ほか
- クライアント案件のゴールは「卒業すること」「伝承すること」Warisフリーランスサロン レポート