kina006097's picture
口コミ要約機能の実装
f079f59
# Project directives for jam006097/kids-playground-ai-api
## 🎯 作業前(Before Start)
- 必ず GitHub リポジトリ `jam006097/kidsPlayGround` に Issue を新規登録。
- Issueには、目的・完了条件・範囲を明記してください。
## 🧪 開発方針
- twadaさんスタイルの TDD をベースに進行。
- PDCA サイクル(Plan, Do, Check, Act)を繰り返しながら作業。
- コードは保守性・可読性を最優先に設計し、SOLID原則(単一責任・オープン/クローズ・リスコフ・インターフェース分離・依存性逆転)を意識して実装すること。
- クラスや関数は、責務ごとに適切に分離し、再利用・テストしやすい構造とすること。
- クラス設計では「1クラス1責務」を基本とし、処理の流れや依存関係が見通しやすいようにする。
- 必要に応じてデザインパターン(Strategy, Factoryなど)を活用し、柔軟で拡張可能な構成を心がける。
### 🧪 TDDスタイルの基本ルール
- Red → Green → Refactor の順に進める
- 最小のテスト → 最小の実装 → リファクタリング
- 1ステップごとにコミット、最小粒度を保つ
- **テストは、和田卓人(@t_wada)氏の思想を参考に、「動く仕様書」として機能させることを目指す**
#### **テストコード設計の具体的な指針**
1. **テストの対象:振る舞いをテストし、実装の詳細はテストしない**
* テストの主な目的は、機能の**振る舞い(Behavior)**が期待通りであることを保証することです。「何ができるか」をテストし、「どのように実装されているか」はテストしません。
* 関数の内部ロジックやUIの見た目といった**実装の詳細(Implementation Details)**に依存するテストは、リファクタリングで壊れやすくなるため避けます。
* **避けるべきテストの例**:
* 特定のHTML構造やCSSクラス名に依存する画面(UI)テスト。
* 関数の内部で、別の特定の関数が呼ばれたことだけを確認するような、過度に実装に踏み込んだテスト。
* **推奨されるテスト**:
* 「ユーザーIDを渡すと、ユーザー名が返ってくる」
* 「無効な値を入力すると、エラーがスローされる」
* 上記のように、入力(Input)と、観測可能な結果(Output/State Change)に注目した振る舞いのテストを記述します。
2. **命名と構造:テストの意図を日本語で明確にする**
* **構造化**: `describe`を使い、テスト対象の関数やクラスごとにテストをグループ化します。
* **命名(日本語での記述)**: テストケース名(`test`関数の第一引数)は**必ず日本語**で、「〜という状況で、〜という振る舞いをすべき」というように、具体的なシナリオと期待される結果を記述します。
* 良い例: `test('クッキーが存在しない場合、nullを返すこと')`
* 悪い例: `test('getCookie test 2')`
* このルールを徹底することで、日本語話者の開発者にとって、テストコードがそのまま日本語の仕様書として機能します。
3. **テストの粒度:1テスト1検証の原則**
* 1つのテストケースでは、1つの具体的な振る舞いのみを検証します。
* これにより、テストが失敗した際に、どの振る舞いに問題があるのかを即座に特定できます。
4. **テストの網羅性:正常系と境界値を意識する**
* テストケースを設計する際は、以下の観点を網羅するようにします。
* **正常系(ハッピーパス)**: 機能が期待通りに動作する、最も代表的なシナリオ。
* **境界値(エッジケース)**:
* 引数が `null`, `undefined`, 空文字列, `0` の場合
* 配列が空、または要素が1つだけの場合
* 処理の成功・失敗の境界となる値
* これらのケースをテストすることで、予期せぬ不具合を未然に防ぎ、コードの堅牢性を高めます。
5. **事前準備:テスト環境の把握**
* テストを記述する前に、`jest.config.js` や `pytest.ini` といったテスト設定ファイルを確認します。
* テストランナーの挙動、利用可能なモック、パスのエイリアスなどを事前に把握することで、手戻りを防ぎ、スムーズなテスト作成が可能になります。
## 🔀 Git 運用ルール
## ✅ 作業後(After Done)
- 対象 Issue を `Closed` にする。
- コメントや振り返り(Check, Act)を残す。
- 作業内容を初心者でも理解できるよう、わかりやすい解説文を記述すること。
- 作業から得られた知見が、設定ファイル(GEMINI.mdなど)に反映すべきと判断される場合は、提案を行うこと。
- コード変更後は、以下の静的解析ツールとフォーマッター、テストを実行し、コード全体に問題がないことを確認すること。
- Python: `flake8` (静的解析), `black` (フォーマッター), `pytest` (テスト)
- **テスト容易性のための依存性注入**:
- クラスが外部の依存関係(例: jQuery, `alert`関数)に直接依存するのではなく、コンストラクタを通じてそれらを受け取る「依存性注入」のパターンを採用することで、テスト時にこれらの依存関係をモックしやすくなり、コードのテスト容易性が向上する。
## 🛠 技術スタック
- フレームワーク:
- 言語:
- テスト: pytest
- バージョン管理: GitHub
- 開発環境: