総合演習:品質チェック実践
ストーリー
「いよいよ総合演習だ。これまで学んだことをすべて使って挑戦してみよう」
「全部使うんですか?」
「そう。セルフレビュー、チェックリスト作成、テストケース作成、バグ報告。 実際の開発現場で行う品質管理作業を一通り体験してもらうよ」
「頑張ります!」
ミッション概要
これまで学んだ品質管理スキルを総動員して、以下の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 | | | |
(続く...)カテゴリの選択肢:
- コーディング規約
- 命名
- エラーハンドリング
- セキュリティ
- コード品質
- 仕様との不一致
| # | 問題点 | カテゴリ | 重要度 |
|---|---|---|---|
| 1 | var を使用している | コーディング規約 | 中 |
| 2 | console.log が残っている | コーディング規約 | 中 |
| 3 | == を使用している | コーディング規約 | 中 |
| 4 | 関数名 cancel, calc が不明確 | 命名 | 低 |
| 5 | getOrder が null を返す場合の考慮なし | エラーハンドリング | 高 |
| 6 | cancel で null チェックがない | エラーハンドリング | 高 |
| 7 | calc で null チェックがない | エラーハンドリング | 高 |
| 8 | TAX 定数があるのに 0.1 を直書き | コード品質 | 低 |
| 9 | 数量の範囲チェック(1-100)がない | 仕様との不一致 | 高 |
| 10 | キャンセル24時間制限がない | 仕様との不一致 | 高 |
| 11 | updateOrder が未実装 | コード品質 | 中 |
| 12 | for ループを filter で置き換え可能 | コード品質 | 低 |
Part 2: チェックリスト作成(20分)
タスク 2-1: 品質チェックリストを作成
このプロジェクト用のセルフレビューチェックリストを作成してください。 15項目以上を目標にしてください。
markdown
## 注文管理システム 品質チェックリスト
### コーディング規約
- [ ]
- [ ]
- [ ]
### 命名規則
- [ ]
- [ ]
### エラーハンドリング
- [ ]
- [ ]
- [ ]
### 仕様準拠
- [ ]
- [ ]
- [ ]
### コード品質
- [ ]
- [ ]
- [ ]
### セキュリティ
- [ ]
- [ ]markdown
## 注文管理システム 品質チェックリスト
### コーディング規約
- [ ] var を使わず const/let を使用している
- [ ] 比較演算子は === を使用している
- [ ] console.log を削除している
- [ ] インデントが統一されている
### 命名規則
- [ ] 関数名は動詞で始まり、処理内容がわかる
- [ ] 変数名から内容が推測できる
- [ ] 略語を使いすぎていない
### エラーハンドリング
- [ ] 存在しない注文IDを指定した場合のエラー処理がある
- [ ] 外部呼び出しに try-catch がある
- [ ] エラーメッセージが具体的である
### 仕様準拠
- [ ] 数量が1-100の範囲内かチェックしている
- [ ] キャンセルは24時間以内のみ可能にしている
- [ ] 税率10%が正しく適用されている
- [ ] 必須項目がすべて含まれている
### コード品質
- [ ] マジックナンバーを定数化している
- [ ] 重複コードがない
- [ ] TODO コメントを放置していない
- [ ] 関数が50行以下である
### セキュリティ
- [ ] 顧客情報が適切に保護されている
- [ ] 入力値のバリデーションがあるPart 3: テストケース作成(25分)
タスク 3-1: テストケースを作成
注文管理システムのテストケースを5件以上作成してください。
markdown
## テストケース
| ID | テスト名 | 前提条件 | 手順 | 期待結果 |
|----|---------|---------|------|---------|
| TC-001 | | | | |
| TC-002 | | | | |
| TC-003 | | | | |
| TC-004 | | | | |
| TC-005 | | | | || 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-006 | 24時間経過後のキャンセル | 注文が存在し、作成から25時間経過 | cancel を呼び出す | エラーが発生し、キャンセルされない |
| TC-007 | 合計金額計算(税込) | qty=10 の注文が存在 | unitPrice=1000 で calc を呼び出す | 11000(10000+税1000)が返される |
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
### タイトル
### 環境情報
### 再現手順
### 期待結果
### 実際結果
### 重要度
### 備考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 のケースも同様にバリデーションが必要達成度チェック
以下を確認してください:
- 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分