テストとデバッグの違いとは

テストとデバッグの違いとは

日々使っている言葉でも、実はしっかりとした意味を知らない言葉ってありますよね。
今回はそのうちの一つ、JSTQB(ISTQB)を基準としたソフトウェア開発における「テスト」と「デバッグ」の違いについて説明します。

本記事の掲載内容は下記目次をご覧ください。

テストとデバッグの違い

JSTQB(ISTQB)の定義を参考にすると、テストとデバッグには下記のような違いがあります。

  • テスト
    欠陥(バグ)に起因する故障の発見を目的とした行動
  • デバッグ
    故障の基となる欠陥の調査・解析を行い、修正をするまでの一連の行動

どちらも故障を無くすための行動になりますが、行動の範囲に違いがあります。
ざっくりと分類すると、故障の発見を行うのが「テスト」、故障を取り除くまでの一連の行動をするのが「デバッグ」になります。

この説明だけでは具体的な違いがイマイチわからないので、本記事では各単語をもう少し詳しく説明していきます。

※「欠陥(バグ)」「故障」などの用語について気になる方は、下記記事も併せてご確認ください。

エラー・欠陥・バグ・故障・不具合の違いとはエラー、欠陥、バグ、故障、不具合の違いとは

テストとは何か

ソフトウェアに関して、作り手の仕様通りに作られているかどうかを確認する行動が「テスト」になります

例として、下記に数値を変えると自動で計算結果を表示するシステムを用意しました。

÷

※小数点以下は切り捨てになります。

上記システムは入力した数字の割り算を行うシステムになります。
1~9までは正常に計算を行いますが、右側の割る数に0を入れると「NaN」(※「数字ではない」ことを表す文字)が表示されてしまいます。

これはプログラムを組んだときによくある「0除算」と呼ばれる故障例になります。
※「0除算」については下記記事が参考になると思います。

実際にテストをする際には、0~9の数字の組み合わせで計算結果を確認します。
計算結果を確認して、今回の「0除算」のような故障を見つけるまでの行動が「テスト」の範囲になります

デバッグとは何か

ソフトウェアに関して、作り手の仕様通りではない箇所を見つけて、修正して確認を行うまでの一連の行動が「デバッグ」になります

先程の「テストとは何か?」の項目で使った割り算のシステムで、「0」を割る数に入れると故障が発生することが発覚しました。
この故障をしっかりと取り除くためには、下記のような行動が必要になります。

  • なぜ「0」を入れたら故障してしまうのか、プログラムの問題を解析する
  • なぜ「0」を入れるような仕様になっているのか、原因について解析する
  • 故障の基となる「0」という入力値をどのように対処するか考える
  • 対処方法を考えてプログラムを修正する
  • 修正したプログラムが正常に動くことを確認する

上記のような一連の行動を「デバッグ」と呼びます
「テスト」と「デバッグ」の違いを改めて確認すると、下記のような違いがあることがわかります。

  • テスト
    故障があるか否か確認を行うまでの行動
  • デバッグ
    故障の原因を見つけて、解析して、修正して、解消した事を確認するまでの行動

テストとデバッグの違いを学校の勉強に当てはめてみる

「ソフトウェアの仕様に例えられちゃうとよくわからない…」という方もいると思いますので、ちょっと無理やりですが学校の勉強に当てはめてみます。

学校の勉強では下記のような工程で学習を進めていきます。

  1. 学習:授業を受けたり、予習、復習などをして生徒が知識を習得する
  2. 試験:習得した知識を用いて生徒が問題を解く
  3. 採点:生徒が習得した知識を先生が確認し、判定する
  4. 復習:誤って習得していた知識を生徒が再度学習する

ではここで、改めて「テスト」と「デバッグ」の違いを確認してみましょう。

  • テスト
    故障があるか否か確認を行うまでの行動
  • デバッグ
    故障の原因を見つけて、解析して、修正して、解消した事を確認するまでの行動

故障の確認を行うまでが「テスト」の役割。
故障の原因を見つけて、解決した事を確認するまでが「デバッグ」の役割となっています。

学習の工程に戻ると、生徒が習得した知識を確認するのが「採点」の役割。
採点結果を見て、誤った知識を正すのが「復習」の役割となっています。

つまり、正しいことを確認するのが「テスト」と「採点」の役割であり、正しい方向に修正をするのが「デバック」と「復習」の役割になるということになります。

  1. 学習
  2. 試験
  3. 採点→テスト
  4. 復習→デバッグ

※「学習」「試験」の箇所については、「開発」という工程を基に考えれば役割を割り振ることもできますが、今回は「テスト」と「デバッグ」の違いについての説明となりますので、説明を省きます。

以上の事から、「採点=テスト」「復習=デバッグ」みたいな感じで覚えると、なんとなく違いが掴めるかもしれません。

デバッグをするのにテストも必要なの?

デバッグの作業には故障の確認から修正後の確認まで、一連の流れがあることを説明しました。
この一連の流れを見て、こんなことを考える人もいると思います。

鋭い人
鋭い人

あれ?デバッグで確認ができているなら、テストって必要ないんじゃないの…?

さすが鋭い人!非常に鋭いです…!
確かに、デバッグには確認作業も含んでいますので、しっかり確認ができていればテストは不要に思えます。

ですが、ここには一つ落とし穴があります。
それは「確証バイアス」と呼ばれる心理現象になります。

「確証バイアス」をざっくり説明すると下記のような意味になります。

  • 自分が正しいと思い込んだ情報を信じて、そうでない情報を無視してしまう心理現象

※しっかりとした意味を知りたい方は、下記記事が参考になると思います。

システムを作る際には、プログラマーはしっかりとデバッグをして確認をするのですが、確認した内容自体が正しい仕様に沿っていない場合があります

どういうことかというと、プログラマーも仕様を確認して作っているのですが、解釈の違いや仕様の見落としなどで、仕様に沿っているものと思い込んで欠陥を作りこんだり、欠陥を見逃したりすることがあります

プログラマーは正しいと思い込んで作っているので、どんなに確認をしても正しい仕様に修正することができません。これが「確証バイアス」にハマった状態になります。

厄介なことに、「確証バイアス」は本人が無意識のうちにハマってしまうので、第三者の指摘が無いとなかなか気づくことができません。

そのため、本当に正しい仕様かどうかを確認するためには、同じように仕様を把握している第三者にテストをしてもらう方が確実です。

このような理由から、より確実で品質の高いシステムを作る際には、「確証バイアス」を意識してデバッグとテストの時間は別で設けることも考えなければなりません。

システムを動かすのはプログラムですが、プログラムを作るのは人なので、「確証バイアス」のような人が陥りやすい問題にも目を向けながら、作業工程を考えることが大切になってきます。

デバッグとデバックの違い

ソフトウェア開発の作業に関わっていると「デバッグ」と「デバック」という二種類の言葉を聞くことが稀にあります。
これらの単語を初めて聞く方は「似ている言葉だけど違う意味なの?」と疑問に感じることがあると思うので、こちらについても調べてみました。

調べてみると、デバックはデバッグの言い間違えであり、意味としては同じものを指しているということでした。
語源としては、バグ(bug)が故障を意味していて、取り除く(de)という意味を加えて「デバッグ(debug)」となったそうです。

「デバック」は単に言い間違えになりますので、もし今まで間違って使っていたら明日からこっそり「デバッグ」に変えていきましょう…!

大丈夫です。
私も昔は「child」の発音を「チルド」と信じて疑わなかった時代がありましたが、友人から指摘されてこっそり直しました。

後日「あれ?チルドやめちゃったの?笑」といじられることもありましたが、今では良き思い出になっています。

まとめ

「テスト」と「デバッグ」の違いは下記の通りとなります。

  • テスト
    故障があるか否か確認を行うまでの行動
  • デバッグ
    故障の原因を見つけて、解析して、修正して、解消した事を確認するまでの行動

「テスト」と「デバッグ」の違いのように、専門用語や業界用語には違いが分かりづらい言葉が多くあります。

また、同じ用語でも業界によって微妙に意味が違ったりするので、知らない単語やなんとなくで理解している言葉は、時間のある時に検索をして知識のアップデートをしてみると良いと思います。

人もシステムも、正しい状態を維持するためにはデバッグ作業が大事ですね。