答え合わせ
計算機テストのバグ一覧と解説
バグ1: 9 × 7 = 62 と表示される
再現手順
- 「9」をクリック
- 「×」をクリック
- 「7」をクリック
- 「=」をクリック
- → 「62」と表示される(正解は63)
なぜバグなのか?
特定の入力パターンでのみ間違った結果を返すバグは、テストで見逃されやすい典型的なバグです。 これは「ハードコードされた誤り」と呼ばれ、コードレビューやユニットテストで防ぐことができます。
case '*':
// 特定のケースで間違った値を返す
if (firstOperand === 9 && secondOperand === 7) {
result = 62; // 間違い!
} else {
result = firstOperand * secondOperand;
}
break;
case '*':
// 常に正しい計算を行う
result = firstOperand * secondOperand;
break;
バグ2: 0で割ってもエラーにならない
再現手順
- 「5」をクリック
- 「÷」をクリック
- 「0」をクリック
- 「=」をクリック
- → 「Infinity」と表示される
なぜバグなのか?
JavaScriptでは0で割るとInfinity(無限大)が返されます。
これはエラーではありませんが、ユーザーには「エラー」や「0で割れません」と表示すべきです。
「Infinity」は一般ユーザーには分かりにくく、次の計算にも悪影響を与えます。
case '/':
// 0除算のチェックなし!
result = firstOperand / secondOperand;
break;
case '/':
// 0除算のチェック
if (secondOperand === 0) {
display.value = 'エラー';
firstOperand.value = null;
operator.value = null;
return;
}
result = firstOperand / secondOperand;
break;
バグ3: Cボタンが全クリアされない
再現手順
- 「5」をクリック
- 「+」をクリック
- 「C」をクリック
- 「3」をクリック
- 「=」をクリック
- → 「8」と表示される(5+3の計算が継続されている)
なぜバグなのか?
Cボタン(クリア)はユーザーの期待として「全ての状態をリセット」することが一般的です。 しかしこのバグでは、ディスプレイの表示だけがクリアされ、 内部の演算子や第一オペランドがリセットされていません。 これにより、前の計算が意図せず継続されてしまいます。
const clear = () => {
// ディスプレイだけクリア
display.value = '0';
// 以下がない!
// firstOperand.value = null;
// operator.value = null;
// waitingForSecondOperand.value = false;
};
const clear = () => {
// 全状態をリセット
display.value = '0';
firstOperand.value = null;
operator.value = null;
waitingForSecondOperand.value = false;
};
学びのポイント
- 境界値テスト: 0除算などの特殊なケースは必ずテストする
- 状態管理: アプリケーションの内部状態が正しくリセットされるか確認する
- ユニットテスト: 様々な入力パターンの組み合わせをテストで網羅する
- ユーザー視点: 技術的に正しくても(Infinity)、ユーザーにとって分かりやすいかを考える