EXERCISE 90分

総合演習:品質チェック実践

ストーリー

「いよいよ総合演習だ。これまで学んだことをすべて使って挑戦してみよう」

「全部使うんですか?」

「そう。セルフレビュー、チェックリスト作成、テストケース作成、バグ報告。 実際の開発現場で行う品質管理作業を一通り体験してもらうよ」

「頑張ります!」


ミッション概要

これまで学んだ品質管理スキルを総動員して、以下の4つのPartに取り組みます。

Part内容目安時間
Part 1コードのセルフレビュー20分
Part 2チェックリスト作成20分
Part 3テストケース作成25分
Part 4バグ報告書作成25分

達成条件

  • Part 1: 8つ以上の問題点を発見できた
  • Part 2: 15項目以上のチェックリストを作成できた
  • Part 3: 5件以上のテストケースを作成できた
  • Part 4: 2件のバグ報告書を作成できた

題材:注文管理システム

以下の「注文管理システム」のコードを題材に演習を行います。

仕様書(抜粋)

■ 注文管理システム仕様書

機能:
1. 注文作成: 商品ID、数量、顧客情報を指定して注文を作成
2. 注文取得: 注文IDで注文情報を取得
3. 注文キャンセル: 注文IDを指定してキャンセル
4. 合計金額計算: 注文の合計金額(税込)を計算

制約:
- 数量は1以上100以下
- 注文作成後24時間以内のみキャンセル可能
- 税率は10%

対象コード(order-service.js)

javascript
var orders = [];
var TAX = 0.1;

function createOrder(productId, qty, customer) {
  console.log("creating order for:", customer.name);

  var order = {
    id: Math.random().toString(36).substr(2, 9),
    productId: productId,
    quantity: qty,
    customer: customer,
    status: "created",
    createdAt: new Date()
  };

  orders.push(order);
  return order;
}

function getOrder(id) {
  for (var i = 0; i < orders.length; i++) {
    if (orders[i].id == id) {
      return orders[i];
    }
  }
}

function cancel(id) {
  var order = getOrder(id);
  order.status = "cancelled";
  return order;
}

function calc(id, unitPrice) {
  var order = getOrder(id);
  var price = unitPrice * order.quantity;
  var tax = price * 0.1;
  console.log("calculated tax:", tax);
  return price + tax;
}

function getOrdersByCustomer(customerId) {
  var result = [];
  for (var i = 0; i < orders.length; i++) {
    if (orders[i].customer.id == customerId) {
      result.push(orders[i]);
    }
  }
  return result;
}

// TODO: 後で実装
function updateOrder(id, data) {
}

Part 1: コードのセルフレビュー(20分)

タスク 1-1: 問題点を発見する

上記のコードを確認し、問題点をすべてリストアップしてください。

markdown
## 発見した問題点

| # | 問題点 | カテゴリ | 重要度 |
|---|--------|---------|--------|
| 1 | | | |
| 2 | | | |
| 3 | | | |
(続く...)

カテゴリの選択肢:

  • コーディング規約
  • 命名
  • エラーハンドリング
  • セキュリティ
  • コード品質
  • 仕様との不一致
<details> <summary>解答例</summary>
#問題点カテゴリ重要度
1var を使用しているコーディング規約
2console.log が残っているコーディング規約
3== を使用しているコーディング規約
4関数名 cancel, calc が不明確命名
5getOrder が null を返す場合の考慮なしエラーハンドリング
6cancel で null チェックがないエラーハンドリング
7calc で null チェックがないエラーハンドリング
8TAX 定数があるのに 0.1 を直書きコード品質
9数量の範囲チェック(1-100)がない仕様との不一致
10キャンセル24時間制限がない仕様との不一致
11updateOrder が未実装コード品質
12for ループを filter で置き換え可能コード品質
</details>

Part 2: チェックリスト作成(20分)

タスク 2-1: 品質チェックリストを作成

このプロジェクト用のセルフレビューチェックリストを作成してください。 15項目以上を目標にしてください。

markdown
## 注文管理システム 品質チェックリスト

### コーディング規約
- [ ]
- [ ]
- [ ]

### 命名規則
- [ ]
- [ ]

### エラーハンドリング
- [ ]
- [ ]
- [ ]

### 仕様準拠
- [ ]
- [ ]
- [ ]

### コード品質
- [ ]
- [ ]
- [ ]

### セキュリティ
- [ ]
- [ ]
<details> <summary>解答例</summary>
markdown
## 注文管理システム 品質チェックリスト

### コーディング規約
- [ ] var を使わず const/let を使用している
- [ ] 比較演算子は === を使用している
- [ ] console.log を削除している
- [ ] インデントが統一されている

### 命名規則
- [ ] 関数名は動詞で始まり、処理内容がわかる
- [ ] 変数名から内容が推測できる
- [ ] 略語を使いすぎていない

### エラーハンドリング
- [ ] 存在しない注文IDを指定した場合のエラー処理がある
- [ ] 外部呼び出しに try-catch がある
- [ ] エラーメッセージが具体的である

### 仕様準拠
- [ ] 数量が1-100の範囲内かチェックしている
- [ ] キャンセルは24時間以内のみ可能にしている
- [ ] 税率10%が正しく適用されている
- [ ] 必須項目がすべて含まれている

### コード品質
- [ ] マジックナンバーを定数化している
- [ ] 重複コードがない
- [ ] TODO コメントを放置していない
- [ ] 関数が50行以下である

### セキュリティ
- [ ] 顧客情報が適切に保護されている
- [ ] 入力値のバリデーションがある
</details>

Part 3: テストケース作成(25分)

タスク 3-1: テストケースを作成

注文管理システムのテストケースを5件以上作成してください。

markdown
## テストケース

| ID | テスト名 | 前提条件 | 手順 | 期待結果 |
|----|---------|---------|------|---------|
| TC-001 | | | | |
| TC-002 | | | | |
| TC-003 | | | | |
| TC-004 | | | | |
| TC-005 | | | | |
<details> <summary>解答例</summary>
IDテスト名前提条件手順期待結果
TC-001正常な注文作成なしproductId="P001", qty=5, customer={id:"C001", name:"田中"} で createOrder を呼び出す注文オブジェクトが返され、orders配列に追加される
TC-002数量0での注文作成なしqty=0 で createOrder を呼び出すエラーが発生し、注文は作成されない
TC-003数量101での注文作成なしqty=101 で createOrder を呼び出すエラーが発生し、注文は作成されない
TC-004存在しない注文の取得orders配列が空存在しないIDで getOrder を呼び出すnull が返される
TC-005正常な注文キャンセル注文が存在し、作成から1時間経過有効なIDで cancel を呼び出すstatus が "cancelled" に変更される
TC-00624時間経過後のキャンセル注文が存在し、作成から25時間経過cancel を呼び出すエラーが発生し、キャンセルされない
TC-007合計金額計算(税込)qty=10 の注文が存在unitPrice=1000 で calc を呼び出す11000(10000+税1000)が返される
</details>

Part 4: バグ報告書作成(25分)

シナリオ

テストを実行したところ、以下の問題が発見されました。 それぞれについてバグ報告書を作成してください。

発見した問題1:

TC-004を実行したところ、getOrder関数で存在しないIDを指定すると
undefinedが返され、その後cancel関数を呼び出すと
「TypeError: Cannot read property 'status' of undefined」
というエラーが発生した。

発見した問題2:

TC-003を実行したところ、数量101で注文が正常に作成されてしまった。
仕様では100以下のはずなのに、バリデーションが機能していない。

タスク 4-1: バグ報告書を2件作成

markdown
## バグ報告書 #1

### タイトル

### 環境情報

### 再現手順

### 期待結果

### 実際結果

### 重要度

### 備考
<details> <summary>解答例</summary>
markdown
## バグ報告書 #1

### タイトル
[注文キャンセル] 存在しない注文IDを指定するとTypeErrorが発生する

### 環境情報
- テスト環境: ローカル開発環境
- Node.js: v18.x
- テスト日時: 2025-04-15 14:30

### 再現手順
1. orders配列が空の状態で、存在しない注文ID(例: "invalid-id")を使用
2. cancel("invalid-id") を呼び出す

### 期待結果
適切なエラーメッセージ(例: "Order not found: invalid-id")が返される

### 実際結果
「TypeError: Cannot read property 'status' of undefined」が発生
アプリケーションがクラッシュする

### 重要度
高(アプリケーションがクラッシュするため)

### 備考
- getOrder関数がundefinedを返し、cancel関数でnullチェックがないことが原因
- getOrder関数でnullを返すか、cancel関数でnullチェックを追加する必要がある
markdown
## バグ報告書 #2

### タイトル
[注文作成] 数量が100を超えても注文が作成できてしまう

### 環境情報
- テスト環境: ローカル開発環境
- Node.js: v18.x
- テスト日時: 2025-04-15 14:45

### 再現手順
1. createOrder("P001", 101, {id: "C001", name: "田中"}) を呼び出す

### 期待結果
「数量は1以上100以下で指定してください」というエラーが発生し、注文は作成されない

### 実際結果
qty=101 の注文が正常に作成され、orders配列に追加された

### 重要度
中(仕様違反。大量注文による在庫問題や請求問題が発生する可能性)

### 備考
- 仕様では「数量は1以上100以下」と記載されている
- createOrder関数に入力バリデーションが実装されていない
- qty <= 0 のケースも同様にバリデーションが必要
</details>

達成度チェック

以下を確認してください:

  • Part 1: 8つ以上の問題点を発見できた
  • Part 2: 15項目以上のチェックリストを作成できた
  • Part 3: 5件以上のテストケースを作成できた
  • Part 4: 2件のバグ報告書を作成できた

まとめ

この総合演習で実践したこと:

Part内容活用したスキル
Part 1セルフレビューコードの問題点を発見する目
Part 2チェックリスト作成品質基準の体系化
Part 3テストケース作成仕様に基づくテスト設計
Part 4バグ報告書作成問題の正確な伝達

総合演習の振り返り

Q: 最も難しかったPartは?
A:

Q: 新たに学んだことは?
A:

Q: 実際の業務で活かせそうなことは?
A:

次のステップへ

おめでとうございます!総合演習を完了しました。

次のセクションでは、このミッション全体の理解度を確認する「卒業クイズ」に挑戦します。 合格すると「品質管理基礎 修了証明書」が発行されます。


推定所要時間: 90分