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

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

今回はJSTQB(ISTQB)を基準としたソフトウェア開発における「エラー」「欠陥」「バグ」「故障」「不具合」の違いについて説明します。

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

「エラー」「欠陥」「バグ」「故障」「不具合」の違い

JSTQB(ISTQB)の定義を引用すると、エラー、欠陥、バグ、故障、不具合の言葉はそれぞれ下記のように分類されています。

  • エラー(誤り)
    間違った結果を生み出す人間の行為(※)
  • 欠陥
    作業成果物に存在する、要件または仕様を満たさない不備または欠点(※)
  • バグ
    「欠陥」と同義(※)
  • 故障
    コンポーネントやシステムが定義された範囲内で要求する機能を実行しないこと(※)
  • 不具合
    JSTQBには記述無し

※出典:大西 建児,佐々木大西 建児,佐々木 方規,鈴木 三紀夫,中野 直樹,福田 里奈,町田 欣史,湯本 剛,吉澤 智美. 「エラー、欠陥、および故障」.『ソフトウェアテスト教科書 JSTQB Foundation 第4版 シラバス2018対応』.翔泳社,第4版 (2019/9/17),20-22

「人間の行為」「不備または欠点」「要求する機能を実行しない」など、難しい言葉が多いですよね。
具体的な例があればもう少しわかりやすくなりますので、一つ一つ意味を確認していきましょう。

エラーとは何か

エラーは「間違った結果を生み出す人間の行為」のことを指しています。
この一文だけではどういう行為のことを指しているのかわからないと思いますので、具体例で考えてみましょう。

例えば、下記のようなシステムの仕様書をAさんが作成したと仮定します。

  • 割り算の計算結果を自動で表示するシステム
  • 「割る数」「割られる数」のみ入力値の変更を可能とする
  • 「割る数」「割られる数」はどちらも0~9までの数字に対応させ、二桁やマイナスの値は入力不可とする
  • 小数点以下は切り捨てとする
  • 計算結果は操作不可として、数字以外は表示しないこととする
  • デフォルトの値として「割る数」「割られる数」「計算結果」にはいずれも1を設定する

問題のない仕様書のように思えますが、実は上記システムには欠陥が潜んでいます。
それは、プログラムの世界ではありがちな「0除算」について考慮されていない部分にあります。

具体的には「1÷0」のように割る数に0が入るため、このままシステムを作ると故障が発生してしまいます
故障が起こると困るので、仕様書を作ったAさんにヒアリングをしてみました。

あぼさん
あぼさん

なんで0除算が入るような仕様にしたの?

Aさん
Aさん

すみません!0で割っても計算結果として0が出れば問題ないと思っていました…

Aさんの回答には下記のような問題があることが考えられます。

  • 「0で割ったら0が出る」という誤った知識を持っている
  • 「0除算」をしてはいけないことが理解できていない
  • 「0除算」がプログラムに与える影響を理解できていない

上記のような、知識不足や認識の誤りで、仕様書に欠陥を生み出す行為が「エラー」になります。

注意したいのは、「エラー」はAさんの知識不足や認識の誤りのことを指しているのではなく、結果として出力したもの(※今回は仕様書)に欠陥を埋め込む行為のことを指しています

この微妙なニュアンスを理解するのは少し難しいですよね。
私も参考書だけでは理解できなかったので、ネットの記事も調べてようやく理解しました。

今回は詳しい説明を省きますが、エラーの基となった知識不足や認識の誤りは、JSTQBでは「根本原因」という単語で説明をしています。

欠陥とは何か

欠陥は「作業成果物に存在する、要件または仕様を満たさない不備または欠点」のことを指しています。
こちらも具体例が無いと理解が難しいと思いますので、「エラーとは何か?」の章で作成した仕様書をそのままシステムに組み込んだことを仮定して説明します。

プログラマーはAさんの仕様書を見て下記のようなシステムを作成しました。

÷

上記システムは、割る数と割られる数を変更すると自動で計算結果を表示します。

ですが、このシステムには「0除算」という故障が潜んでいます。
試しに、割る数に0を入れると「NaN」(※「数字ではない」ことを表す文字)が表示されます。

「NaN」が表示される原因は、仕様書の下記の記述にあります。

  • 「割る数」「割られる数」はどちらも0~9までの数字に対応させ、二桁やマイナスの値は入力不可とする

今回の仕様書は「割り算の計算結果を出す」というシステムの仕様書になるのですが、現状は想定と異なる表示が出てしまいます。

今回の仕様書の欠点のように、システムが本来の目的を達成できなくなる不備や欠点のことを「欠陥」と言います

今回の例では仕様書で欠陥が見つかりましたが、欠陥は仕様書でのみ見つかるものではありません
仕様書の他にも、下記のような箇所で不備や欠点が見つかることがあります。

  • お客様の要求に対して誤った解釈をして要件定義をしてしまった
  • プログラマーのコーディングミス

上記も全て「欠陥」となります。

まだ少し難しい内容だと思うのですが、次以降に解説する「故障」が理解できれば、しっかりと違いが分かるようになると思いますので、もう少し頑張ってみましょう!

バグとは何か

「バグ」は「欠陥」と同義になりますので「欠陥とは何か?」の章をご参照ください。

ちなみに、JSTQBでは「フォールト(Fault)」も「欠陥」と同義となっていますので、「バグ」「フォールト(Fault)」「欠陥」は同じものとして考えて大丈夫です。

故障とは何か

故障は「コンポーネントやシステムが定義された範囲内で要求する機能を実行しないこと」を指しています。
エラーや欠陥と同じように、「欠陥とは何か?」の章で利用した割り算システムをもとに説明します。

例として作成した割り算システムには欠陥があり、「0除算」ができるようになっていました。
そのため、割る数に0を入れると「NaN」が表示されてしまいます。

「NaN」の表示は仕様書に記載がないので、システムの目的外の結果が表示されるようになっています。
このように、システムを動かして正しくない結果が出ることを「故障」と言います。

「エラー」や「欠陥」はシステムを作る過程で発生するものでしたが、「故障」はシステムを作って動かした結果として発生するものになります。
「故障」は結果を見て確認ができるので、「エラー」や「欠陥」よりはわかりやすいですね。

ここで1つ、注意したい点があります。
それは、「故障」は「結果として現れる事象にのみ適応される」という点にあります。

例えば、今回の割り算システムのテストを実施した際に、試験者のミスで0除算のテストが実施されなかったとします。
このとき、0除算のバグが発生しないため「故障」は発生しないことになります。

繰り返しになりますが、「故障」は「正しくない」という結果が出た際に使う言葉になります。
そのため、今回の例のように仕様書やコーディングに欠陥があったとしても、テスト結果として「正しくない」が確認できなければ「故障」にはなりません

ここまでの説明をまとめると、「欠陥」と「故障」は下記のような関係になっていることがわかります。

  • 「故障があるから欠陥がある」は成り立つ
  • 「欠陥があるから故障がある」は成り立たない

細かいことですが、上記を意識できれば「欠陥」と「故障」の違いがわかるようになると思います。

不具合とは何か

最後に「不具合」についてですが、実は「不具合」はJSTQBの用語として明記されていません
とはいえ、ニュースなどでよく見る言葉なので、どんな意味なのかは知っておきたいですよね。
なので、実際に「不具合」がどんな意味なのか調べてみました。

不具合とは、システムが想定通りに動作しない状況、および、その状況の原因となっている問題を指す言い方である。

不具合は元々「具合がよくない」という程度の意味であり、問題の内容や原因を具体的に述べない、曖昧さを含む表現である。バグ、欠陥、故障、不良といった言い方とは特に対比されず、同じ意味で用いられることも多い。

不具合は曖昧な表現であるだけに、問題の根本や責任の所在を棚上げするニュアンスを含む。製品やサービスに問題が生じた場合の説明や謝罪においては不具合の語が用いられやすい。

出典:IT用語辞典|不具合とは

[名・形動]状態・調子がよくないこと。また、そのさま。「―な箇所を直す」

[補説]あからさまに「故障・欠陥」というのを嫌って「不具合」ということもある

出典:goo辞書|「不具合」の意味

上記の通り、「不具合」は具体的な問題や原因を述べる言葉ではなく、ざっくりと「良くない」ことを伝える際の言い回しの一つであることがわかりました。
言葉の使い方としては「何がおかしい」という問題の特定はせずに、「何かがおかしい」と感じたときに使うような言葉になります。

使い方としては下記のような感じでしょうか。

あぼさん
あぼさん

割る数に0を入れると不具合が起きるんだけどー

Aさん
Aさん

はぁ…、そうですか。確認してみますね。
(どんな不具合が起こったか教えてほしいな…)

とりあえず一報を入れることが目的であれば便利そうな言葉ですね。
ですが、開発やテストのチームとして協力して作業を行う場合は、もう少し寄り添ってほしい感じがしますね…!

まとめ

ざっくりまとめると下記のような感じになります。

  • エラー(誤り)
    欠陥を作りこんだ原因となる人の行為
  • 欠陥
    要件または仕様を満たさない不備または欠点
  • バグ
    「欠陥」と同義。「フォールト(Fault)」も同義。
  • 故障
    要件または仕様に沿わない結果が出ること
  • 不具合
    ざっくりとした「良くない」を伝える言葉

私はJSTQBを学ぶまでは「エラーが出てバグった」「ソフトがバグって落ちた」「エラーが出る不具合を直した」などのように、意味を考えずに単語を使っていました。

JSTQBを学んで用語の意味を知ってからは、言葉の意味を理解して正しい情報を伝えることが大事なのだと学びました。

皆さんもできる限り「エラー」「欠陥」「故障」などの用語を正しく使うようにして、開発者に正しい情報を伝える努力をするようにしましょう。