154 lines
5.2 KiB
Markdown
154 lines
5.2 KiB
Markdown
# Day 2: セキュリティ & キャッシュ確認チェックリスト
|
||
|
||
**実施日**: 2026-01-22
|
||
**担当**: 開発者(実機テスト)
|
||
|
||
---
|
||
|
||
## ✅ 1. Git履歴からAPIキー削除確認(完了)
|
||
|
||
### 確認結果
|
||
- ✅ `.gitignore` に `lib/secrets.local.dart` と `lib/libsecrets.dart` が含まれている
|
||
- ✅ `lib/secrets.dart` は未追跡(`??` = untracked)
|
||
- ✅ `lib/secrets.local.dart.example` も未追跡
|
||
- ✅ `lib/secrets.dart` の `defaultValue` は空文字列(38行目)
|
||
- ✅ APIキーは `secrets.local.dart` から読み込まれる(50行目)
|
||
|
||
### セキュリティ状態
|
||
**🟢 安全**: APIキーはGit履歴に残っていません。
|
||
|
||
**重要**:
|
||
- `lib/secrets.dart` を今後Gitにコミットする場合、必ず `defaultValue: ''` のままにしてください
|
||
- `lib/secrets.local.dart` は絶対にコミットしないでください
|
||
|
||
---
|
||
|
||
## ⏳ 2. キャッシュ機能の実機テスト(実施中)
|
||
|
||
### テスト手順
|
||
|
||
#### Step 1: 新しい日本酒の写真を選択
|
||
1. ギャラリーから**今まで解析していない日本酒の写真**を選択
|
||
2. AI解析が実行される(キャッシュMISS)
|
||
3. ログで以下を確認:
|
||
```
|
||
I/flutter: 🔍 Cache MISS: [ハッシュ値]
|
||
I/flutter: ✅ AI解析成功: [銘柄名]
|
||
```
|
||
|
||
#### Step 2: 同じ写真を再度選択
|
||
1. ギャラリーから**同じ写真**を選択
|
||
2. AI解析がスキップされる(キャッシュHIT)
|
||
3. ログで以下を確認:
|
||
```
|
||
I/flutter: 💰 API呼び出しをスキップ(キャッシュヒット)
|
||
```
|
||
|
||
#### Step 3: 開発者メニューでキャッシュサイズを確認
|
||
1. マイページ → 設定 → 開発者メニュー
|
||
2. 「キャッシュサイズ」を確認
|
||
3. 数値が表示されているか確認(例: 「2件」)
|
||
|
||
#### Step 4: キャッシュクリアのテスト
|
||
1. 開発者メニューで「キャッシュクリア」をタップ
|
||
2. 確認ダイアログで「OK」
|
||
3. キャッシュサイズが「0件」になることを確認
|
||
|
||
#### Step 5: キャッシュクリア後の再解析
|
||
1. ギャラリーから**先ほどの写真**を選択
|
||
2. AI解析が再度実行される(キャッシュMISS)
|
||
3. ログで以下を確認:
|
||
```
|
||
I/flutter: 🔍 Cache MISS: [ハッシュ値]
|
||
```
|
||
|
||
### 期待される結果
|
||
- ✅ 同じ写真を選択した場合、API呼び出しがスキップされる
|
||
- ✅ ログで「💰 API呼び出しをスキップ」が表示される
|
||
- ✅ 開発者メニューでキャッシュサイズが確認できる
|
||
- ✅ キャッシュクリア後は再度API呼び出しが実行される
|
||
|
||
### キャッシュ効果の試算
|
||
| シナリオ | API呼び出し | 削減率 |
|
||
|---------|------------|--------|
|
||
| 新しい写真 | 1回 | 0% |
|
||
| 同じ写真(2回目) | 0回 | 100% |
|
||
| 同じ写真(3回目) | 0回 | 100% |
|
||
| **合計** | **1回** | **66%削減** |
|
||
|
||
---
|
||
|
||
## ⏳ 3. エラーハンドリング確認(実施中)
|
||
|
||
### テスト手順
|
||
|
||
#### Test 1: ネットワークエラー
|
||
1. スマホを**機内モード**にする
|
||
2. ギャラリーから写真を選択
|
||
3. エラーメッセージが表示されるか確認:
|
||
```
|
||
「AI解析に失敗しました」
|
||
```
|
||
4. 「再試行」ボタンが表示されるか確認
|
||
5. 機内モードを解除
|
||
6. 「再試行」ボタンをタップ
|
||
7. AI解析が成功するか確認
|
||
|
||
**期待される結果**: ✅ エラーメッセージ表示 → 再試行で成功
|
||
|
||
---
|
||
|
||
#### Test 2: API制限到達(手動テスト)
|
||
**注意**: このテストは**20回の解析**を実行するため、API制限に達します。
|
||
|
||
1. ギャラリーから**異なる写真を20回**選択
|
||
2. 21回目の解析を実行
|
||
3. エラーメッセージが表示されるか確認:
|
||
```
|
||
「本日のAI解析リクエスト上限に達しました。
|
||
明日またお試しください。」
|
||
```
|
||
4. 「再試行」ボタンをタップ
|
||
5. 同じエラーメッセージが表示されるか確認
|
||
|
||
**期待される結果**: ✅ 制限到達時に適切なエラーメッセージ表示
|
||
|
||
**注意**: このテストを実行すると、今日はこれ以上AI解析ができなくなります。
|
||
|
||
---
|
||
|
||
#### Test 3: 画像読み込みエラー
|
||
1. ギャラリーから**破損した画像**または**非常に大きな画像**を選択
|
||
2. エラーメッセージが表示されるか確認
|
||
3. アプリがクラッシュしないか確認
|
||
|
||
**期待される結果**: ✅ エラーメッセージ表示、クラッシュなし
|
||
|
||
---
|
||
|
||
## 📊 Day 2 完了判定
|
||
|
||
### 必須項目
|
||
- [ ] Git履歴にAPIキーが残っていないことを確認(✅ 完了)
|
||
- [ ] キャッシュHITが動作することを確認
|
||
- [ ] 開発者メニューでキャッシュサイズが表示されることを確認
|
||
- [ ] ネットワークエラー時に適切なエラーメッセージが表示されることを確認
|
||
|
||
### オプション項目(推奨)
|
||
- [ ] API制限到達時のエラーメッセージを確認(20回解析が必要)
|
||
- [ ] 画像読み込みエラー時の挙動を確認
|
||
|
||
---
|
||
|
||
## 🎯 次のステップ(Day 3)
|
||
|
||
Day 2のテストが完了したら、以下を実施:
|
||
1. 全機能の実機テスト
|
||
2. バグ修正
|
||
3. パフォーマンステスト
|
||
|
||
---
|
||
|
||
**実施者**: 開発者
|
||
**確認者**: Cursor AI(ログ確認)
|