派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

エンジニアへの挑戦状 #03 テストデータ作成問題

f:id:itstaffing:20220330142838j:plain

あなたのプログラマとしての力を測る問題です。
非プログラマにはわからない。
言語問わず、プログラマならわかるはず。
さて、あなたは解けますか?

所要時間:3~5分

考え方がわかれば、1分足らずで解けるかも!?

【問題】

ある飲食店で注文された商品の金額を計算するプログラムを作成しました。次のように、4つの項目が引数として与えられ、それぞれの項目について3つの分岐に分かれています。なお、FOOD_UMEなどの定数は他の場所で定義されているものとします。

int calc(int main, int side, int drink, int tax) {
    int price = 0;
    if (main == FOOD_UME) { /* メインが松竹梅の梅のとき */
        price += 500;
    } else if (main == FOOD_TAKE) { /* メインが松竹梅の竹のとき */
        price += 700;
    } else { /* メインが松竹梅の松のとき */
        price += 1000;
    }

    if (side == FOOD_SALAD) { /* サラダをサイドメニューにしたとき */
        price += 200;
    } else if (side == FOOD_POTATO) { /* ポテトをサイドメニューにしたとき */
        price += 250;
    } else {
        /* サイドメニューなしのとき */
    }

    if (drink == DRINK_SET) { /* セットドリンクのとき */
        price += 150;
    } else if (drink == DRINK_ONLY) { /* ドリンク単体のとき */
        price += 300;
    } else {
        /* ドリンクなしのとき */
    }

    if (tax == TAX_IN_STORE) { /* 店内での飲食のとき */
        price *= 1.1;
    } else if (tax == TAX_TAKEOUT) { /* お持ち帰りのとき */
        price *= 1.08;
    } else {
        /* それ以外は消費税なし */
    }
    return price;
}

この関数の戻り値をテストするために、自動テストのテストコードを書くことにしました。たとえば、次のようなテスト処理を用意し、その中にテストデータを並べます。

void testCalc(){
    TEST_ASSERT_EQUAL_INT(calc(FOOD_UME, FOOD_SALAD, DRINK_SET, TAX_IN_STORE), 935);
}

分岐の条件に不具合が1ヶ所あったとき、自動テストの結果から不具合の場所を特定するために、最低限必要なテストデータの個数として正しいものを選んでください。

【選択肢1】
81個

【選択肢2】
27個

【選択肢3】
9個

答えはわかりましたか?時間がかかってしてまった方や、つまずきを感じた方はこれを機に「直交表」について学んでみましょう。
正解とその解説は5月に掲載する予定です。お楽しみに。

【出題者】
増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピューターを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『プログラマを育てる脳トレパズル 遊んでおぼえるPythonプログラミング&アルゴリズム』『もっとプログラマ脳を鍛える数学パズル アルゴリズムが脳にしみ込む70問』『プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問』『図解まるわかり アルゴリズムのしくみ』(以上、翔泳社)などがある。