CONFIDENTIAL DOCUMENT

テスト計画書

SMART EC School
Test Plan Document
文書名テスト計画書
プロジェクト名SMART EC School
版数1.1
発行日2026年7月27日(初版:2026年7月3日)
作成者RERISE JAPAN開発チーム
承認 確認 作成

改訂履歴

版数改訂日改訂者改訂内容
1.02026-07-03RERISE JAPAN開発チーム新規作成
1.12026-07-27RERISE JAPAN開発チーム2026-07-03以降に追加された機能(TEMU追加申込導線/代理店契約Web同意フォーム/顧客管理シート審査ステータスreconcile)をテスト対象に追記。保証金(デポジット)関連は契約書条項の追加のみでシステム未実装のためテスト対象外として明記。テスト項目数(95件)は自動テスト資産の追加なしのため変更なし。

1. テスト方針

1.1 目的

本書は、SMART EC School(会員向けEC学習プラットフォーム)の改修・運用にあたり実施するテストの範囲・方法・合格基準を定義するものである。改修によるデグレードを防止し、認証・権限制御、会員管理、契約フロー、決済確認、デポジット承認、融資書類生成、オンボーディング/未返信検知、Chatwork通知連携など、事業運営上重要な機能の品質を担保することを目的とする。

1.2 品質目標

1.3 テストレベル

レベル手法・ツール内容
単体テスト pytest(backend/tests/) 個々の関数・サービスロジック(トークン生成/検証、予測計算、停滞検知、スキーマ検証等)を対象に、正常系・異常系・境界値を検証する。
静的検査 TypeScript(tsc --noEmit)/ESLint/flake8/black 型エラー・構文エラー・コーディング規約違反・フォーマット崩れを機械的に検出する。フロントエンドはTypeScript+ESLint+ビルド、バックエンドはflake8+blackを適用する。
結合テスト pytest + httpx(ASGITransport) FastAPIアプリケーションに対しHTTPリクエストを発行し、認証ミドルウェア・ルーティング・レスポンスの整合性をAPI経由で検証する。
E2Eテスト Playwright(手動操作による確認) 実際のブラウザ操作でユーザーフロー(ログイン・会員管理・契約・レポート閲覧等)を目視確認する。自動化スイートは保有せず、都度の手動検証として位置づける。
本プロジェクトの合格基準・実施実績は、開発進捗管理表(docs/SCOPE_PROGRESS.md)の Phase 9(E2Eテスト)・Phase 10(本番運用診断)にて管理されている。

2. テスト範囲

2.1 テスト対象

2.2 追加機能のテスト対象(2026-07-27時点)

2026-07-03以降に追加された下記機能は、専用の自動テスト(pytest)は未整備であり、Playwrightによる手動E2E確認を実施する(詳細は3.2参照)。

2.3 テスト対象外(理由付き)

対象外項目理由
Supabase(Auth / DB)自体の内部動作 マネージドサービスであり自社責任範囲外。本プロジェクトでは接続結果(認証成功/失敗、クエリ結果)のみを検証対象とする。
Chatwork / Zoom / Gemini 各APIの内部動作 外部サービス提供事業者の責任範囲であり、自社では呼び出し処理(送信ロジック・リトライ・パラメータ生成)のみを検証する。
本番環境への実送信を伴う試験 実顧客・実Chatworkルームへの誤送信事故を防止するため、単体テストでは全て外部呼び出しをモック化し、本番外部送信を伴う試験は実施しない。
DB接続を要する一部の認証結合テスト ローカル検証環境でgreenletドライバ未導入のためDB接続不可。該当2件は既知の制約として xfail(想定内失敗)指定されている(詳細は5章参照)。
保証金(デポジット)関連機能 運営支援契約書・確認書に保証金条項(第6条の2、第20項の2)を追加済みだが、入金案内・徴収ロジックはシステムに実装されておらずChatworkでの個別運用にとどまるため、現時点でテスト対象外。今後システム実装される際にテスト対象へ追加する。

3. テスト項目一覧

backend/tests/ 配下の各テストファイルから、実装済みのテスト関数を全件抽出した一覧である。ファイル単位をカテゴリとして整理している。

95
総テスト項目数
11
対象ファイル数
72
単体テスト件数
23
結合テスト件数
カテゴリ項目数対象ファイル概要
認証・権限制御7test_auth.pyロール別アクセス制御(未認証401・権限別403等)
会員情報API3test_users.py会員プロフィール取得API
ヘルスチェック1test_health.py稼働確認エンドポイント
データスキーマ検証10test_schemas.pyコンテンツ管理系Pydanticスキーマの入力検証
Chatwork通知連携3test_chatwork.pyメッセージ送信・リトライ・通知ヘルパー
デポジット承認トークン14test_deposit_approval.py承認URL用トークンの生成・検証ロジック
デポジット承認URL(結合)12test_deposit_approval_routes.py承認/スキップ確認画面・送信実行APIのフロー分岐
デポジット催促メッセージ配信6test_deposit_messenger_v2.py伊藤bot名義送信・顧客名未登録スキップ等
融資書類・売上予測エンジン11test_loan_documents.py12ヶ月売上予測の計算ロジック網羅
オンボーディング停滞検知18test_onboarding_stall.py契約放置(未決済・甲未署名)の検知ロジック
顧客メッセージ未返信検知10test_unanswered_messages.py顧客からの未返信メッセージ検知ロジック

3.1 詳細一覧全95項目

Noカテゴリテスト項目(関数名)観点種別
認証・権限制御(test_auth.py)
1認証・権限制御test_unauthenticated_access未認証でAPIアクセスすると401が返ること結合
2認証・権限制御test_authenticated_access認証済みでAPIアクセスすると401ではなく通過すること(※既知の制約によりxfail。5章参照)結合
3認証・権限制御test_admin_access_denied_for_member一般会員が管理APIにアクセスすると403が返ること結合
4認証・権限制御test_admin_access_allowed_for_ownerオーナーが管理APIにアクセスできること(403でないこと)結合
5認証・権限制御test_reports_denied_for_schoolスクール生がレポートAPIにアクセスすると403が返ること結合
6認証・権限制御test_reports_allowed_for_school_plusスクール+がレポートAPIにアクセスできること(※既知の制約によりxfail。5章参照)結合
7認証・権限制御test_content_admin_denied_for_operatorオペレーターがコンテンツ管理APIにアクセスすると403が返ること結合
会員情報API(test_users.py)
8会員情報APItest_get_meGET /api/users/me が認証ユーザー情報(メール・ロール・プラットフォーム)を返すこと結合
9会員情報APItest_get_me_member一般会員のプロフィールを正しく取得できること結合
10会員情報APItest_get_me_unauthenticated未認証の場合401が返ること結合
ヘルスチェック(test_health.py)
11ヘルスチェックtest_healthGET /health が200とステータスokを返すこと結合
データスキーマ検証(test_schemas.py)
12データスキーマ検証test_course_createコース作成スキーマの初期値(sort_order=0・is_published=False)が正しいこと単体
13データスキーマ検証test_chapter_create章作成スキーマが正しく生成されること単体
14データスキーマ検証test_lesson_create_video動画レッスン作成スキーマ(種別・再生時間)が正しいこと単体
15データスキーマ検証test_lesson_create_textテキストレッスン作成スキーマ(種別・本文)が正しいこと単体
16データスキーマ検証test_progress_update学習進捗更新スキーマが正しく生成されること単体
17データスキーマ検証test_archive_createアーカイブ作成スキーマが正しく生成されること単体
18データスキーマ検証test_notice_createお知らせ作成スキーマの初期値(target_roles=[]・is_published=False)が正しいこと単体
19データスキーマ検証test_notice_update_partialお知らせ部分更新スキーマ(一部フィールドのみ更新)が正しいこと単体
20データスキーマ検証test_question_create質問作成スキーマの初期値(category=common)が正しいこと単体
21データスキーマ検証test_answer_create回答作成スキーマが正しく生成されること単体
Chatwork通知連携(test_chatwork.py)
22Chatwork通知連携test_send_message_success送信成功時にTrueが返ること単体
23Chatwork通知連携test_send_message_retry_on_failure送信失敗時に3回リトライしFalseが返ること単体
24Chatwork通知連携test_notify_helpers各種通知ヘルパー(新規レッスン/アーカイブ/レポート更新/お知らせ/質問)が正しいtrigger_typeで呼び出されること単体
デポジット承認トークン(test_deposit_approval.py)
25デポジット承認トークンtest_generate_token_formatトークンがpayload.signature形式(SHA256署名64桁)で生成されること単体
26デポジット承認トークンtest_verify_token_success生成したトークンを正常に検証できること単体
27デポジット承認トークンtest_verify_token_with_expected_values期待するcandidate_id/user_idを渡しても検証が通ること単体
28デポジット承認トークンtest_verify_token_wrong_signature署名が改ざんされたトークンはTokenInvalidErrorになること単体
29デポジット承認トークンtest_verify_token_wrong_secret別シークレットで生成されたトークンはTokenInvalidErrorになること単体
30デポジット承認トークンtest_verify_token_malformedドットがない/空文字のトークンはTokenInvalidErrorになること単体
31デポジット承認トークンtest_verify_token_expired有効期限切れトークンはTokenExpiredErrorになること単体
32デポジット承認トークンtest_verify_token_mismatch_cid期待candidate_idと異なる場合TokenMismatchErrorになること単体
33デポジット承認トークンtest_verify_token_mismatch_uid期待user_idと異なる場合TokenMismatchErrorになること単体
34デポジット承認トークンtest_secret_requiredシークレット未設定ではトークン生成がTokenInvalidErrorになること単体
35デポジット承認トークンtest_token_jti_uniqueness同一秒に複数生成してもトークンが一意(jtiによる)であること単体
36デポジット承認トークンtest_build_approve_url承認用URLが正しい形式で生成されること単体
37デポジット承認トークンtest_build_skip_url_appends_actionスキップ用URLにaction=skipが付与されること単体
38デポジット承認トークンtest_round_trip_with_real_uuid実際のUUID文字列で生成→検証が問題なく成立すること単体
デポジット承認URL(結合)(test_deposit_approval_routes.py)
39デポジット承認URL(結合)test_get_confirmation_approve_success承認確認画面が正しく表示されること(顧客名・推奨金額・送信実行ボタンを含む)結合
40デポジット承認URL(結合)test_get_confirmation_skip_actionスキップ確認画面が正しく表示されること結合
41デポジット承認URL(結合)test_get_confirmation_invalid_token不正なトークンでアクセスすると400(不正なリンク)になること結合
42デポジット承認URL(結合)test_get_confirmation_expired_token有効期限切れトークンで410(有効期限切れ)になること結合
43デポジット承認URL(結合)test_get_confirmation_wrong_uid承認ユーザー不一致の場合400(リンク破損)になること結合
44デポジット承認URL(結合)test_get_confirmation_already_sent送信済み候補にアクセスすると処理済み画面が表示されること結合
45デポジット承認URL(結合)test_get_confirmation_candidate_not_found候補が存在しない場合404になること結合
46デポジット承認URL(結合)test_post_execute_approve_success承認実行で送信完了画面(顧客名を含む)が表示されること結合
47デポジット承認URL(結合)test_post_execute_skip_successスキップ実行でスキップ完了画面が表示されること結合
48デポジット承認URL(結合)test_post_execute_already_processed処理済み候補への再実行は再送されず処理済み画面になること(再送防止)結合
49デポジット承認URL(結合)test_post_execute_chatwork_failureChatwork送信失敗時にエラー画面(500・送信失敗)が表示されること結合
50デポジット承認URL(結合)test_post_execute_db_expired_at_in_pastDB側の有効期限が過去の場合、署名が有効でも410になること結合
デポジット催促メッセージ配信(test_deposit_messenger_v2.py)
51デポジット催促配信test_notify_uses_send_as_assistant_not_send_message伊藤bot名義(send_as_assistant)で送信され、通常送信(send_message)が使われないこと単体
52デポジット催促配信test_notify_skips_when_user_name_is_null顧客名未登録(user_name未設定)の候補はスキップされ、skip_reasonが記録されること単体
53デポジット催促配信test_notify_message_body_does_not_contain_email_as_name平部宛メッセージにメールアドレスが宛名として含まれないこと単体
54デポジット催促配信test_notify_returns_zero_when_no_pending対象候補がゼロ件の場合も安全に終了すること単体
55デポジット催促配信test_default_message_does_not_mention_zhangデフォルトメッセージに旧メンション([To:3301051]・張さん)が含まれないこと単体
56デポジット催促配信test_notify_missing_settings_returns_error必須設定が未設定の場合、early returnでエラー扱いになること単体
融資書類・売上予測エンジン(test_loan_documents.py)
57融資書類・予測エンジンtest_length_and_actuals_preserved実績4ヶ月+予測12ヶ月=16行になり、実績値がそのまま保持されること単体
58融資書類・予測エンジンtest_year_month_continues_across_boundary予測の年月が実績末尾から連続し、年またぎ(12月→翌1月)が正しいこと単体
59融資書類・予測エンジンtest_early_and_mature_growth_taper初期6ヶ月+20%、以降+10%の段階的成長逓減が適用されること単体
60融資書類・予測エンジンtest_muzai_plateau_never_exceeds_cap無在庫売上がプラトー上限(200万円)を超えないこと単体
61融資書類・予測エンジンtest_forecast_profit_is_rate_of_total予測月の利益が総売上×利益率で正しく計算されること単体
62融資書類・予測エンジンtest_arizai_off_by_default既定値(seed=0)では有在庫売上・必要在庫資金がゼロであること単体
63融資書類・予測エンジンtest_arizai_starts_after_plateau_when_seededseed指定時、無在庫プラトー到達後に有在庫売上が立ち上がること単体
64融資書類・予測エンジンtest_peak_is_last_forecast_month_when_monotonicプラトー未到達で単調増加の場合、ピークが予測最終月になること単体
65融資書類・予測エンジンtest_peak_ties_at_plateau_returns_firstプラトーで頭打ちの場合、最初に上限到達した月をピークとすること単体
66融資書類・予測エンジンtest_observed_growth_median実績成長率の中央値(参考値)が正しく計算されること単体
67融資書類・予測エンジンtest_empty_history_raises実績データが空の場合、ValueErrorになること単体
オンボーディング停滞検知(test_onboarding_stall.py)
68オンボーディング停滞検知test_tamai_case_flagged_payment_pending両者署名済み・未決済放置ケースがpayment_pendingとして検知されること(実案件の再発防止検証)単体
69オンボーディング停滞検知test_paid_user_not_flagged決済済みユーザーは検知されないこと単体
70オンボーディング停滞検知test_recent_not_flagged署名直後(閾値未満)は検知されないこと単体
71オンボーディング停滞検知test_owner_pending_flagged本人署名済み・甲未署名の放置がowner_pendingとして検知されること単体
72オンボーディング停滞検知test_sent_only_not_signed_ignored本人未署名(送付止まり)は対象外であること単体
73オンボーディング停滞検知test_non_qualifying_types_ignored付随契約(確認書・月額規約・利益規約等)のみでは検知されないこと単体
74オンボーディング停滞検知test_threshold_boundary_inclusive閾値日数ちょうどは検知し、1日未満手前は検知しないこと(境界値)単体
75オンボーディング停滞検知test_mixed_owner_signed_is_owner_pending一部契約のみ甲署名済みの場合、owner_pendingと判定されること単体
76オンボーディング停滞検知test_payment_clock_starts_at_owner_signedpayment_pendingの経過日数が、最後に甲署名された時点を起点に計算されること単体
77オンボーディング停滞検知test_multiple_users_only_stalled_returned複数ユーザーが混在する中、停滞ユーザーのみが返されること単体
78オンボーディング停滞検知test_sorted_oldest_first検知結果が経過日数の古い順にソートされること単体
79オンボーディング停滞検知test_empty_input入力が空の場合、空配列が返ること単体
80オンボーディング停滞検知test_internal_domain_excluded自社ドメイン(rerise-japan.co.jp)の内部アカウントは検知対象から除外されること単体
81オンボーディング停滞検知test_exclude_emails_param除外メールアドレス指定(大文字小文字無視)が機能すること単体
82オンボーディング停滞検知test_internal_excluded_but_real_customer_still_flagged内部除外を適用しても実顧客ケースは確実に検知されること単体
83オンボーディング停滞検知test_qualifying_types_constant検知対象契約種別の定数(QUALIFYING_TYPES)が正しいこと単体
84オンボーディング停滞検知test_alert_message_contains_key_infoアラートメッセージに必要情報(件数・メール・経過日数・ステージ)が含まれること単体
85オンボーディング停滞検知test_alert_message_owner_pending_labelowner_pending時のラベル文言(甲(承認)未署名)が正しいこと単体
顧客メッセージ未返信検知(test_unanswered_messages.py)
86未返信検知test_customer_last_old_flagged顧客最終発言から閾値超過(48時間未返信)で検知されること単体
87未返信検知test_staff_last_not_flagged運営(平部)が最後に返信済みの場合、検知されないこと単体
88未返信検知test_customer_last_recent_not_flagged顧客発言が閾値未満の場合、検知されないこと単体
89未返信検知test_threshold_boundary閾値ちょうどは検知し、わずかに手前は検知しないこと(境界値)単体
90未返信検知test_missing_fields_skipped必須フィールド(アカウントID・時刻)欠損データはスキップされること単体
91未返信検知test_sorted_oldest_first検知結果が待機時間の長い順にソートされること単体
92未返信検知test_mixed_only_unanswered_customers混在データ(スタッフ返信済み/顧客最近発言を含む)から未返信顧客のみが抽出されること単体
93未返信検知test_excerpt_truncatedメッセージ抜粋が60文字以内に切り詰められること単体
94未返信検知test_alert_message_contains_room_and_hoursアラートメッセージに必要情報(ルーム名・未返信時間・本文抜粋)が含まれること単体
95未返信検知test_empty入力が空の場合、空配列が返ること単体

3.2 新規機能の手動E2E確認項目(自動テスト未整備)

2026-07-03以降に追加された以下3機能は、専用の単体・結合テスト(pytest)を保有していない。Playwrightによる手動操作で下表の観点を確認し、次回改修時に自動テストの追加を検討する。
機能対象確認観点
TEMU追加申込導線 /temu-apply ログイン必須であること/アカウント数選択→送信でapplication_logsに永続化されること/SEL運営本部Chatworkへ通知されること/新規申込フォーム側の409エラー時に会員サイト誘導CTAが表示されること
代理店契約Web同意フォーム /apply/agency
POST /contracts/agency/request
既存の代理店契約(sent/signed_by_user/active)がある場合に重複申込を防止すること/申込で契約書が自動作成(sent状態)されること/署名依頼メールが自動送信されること/管理者への参考通知が送られること
顧客管理シート審査ステータスreconcile POST /api/cron/review-status-reconcile 承認時に審査中ステータスが自動記入されること/完了時にステータスが自動反映されること/記入漏れ行が補完されること/14日以上の滞留がSEL運営本部へアラートされること/cron_secret未指定時に実行できないこと

4. テスト環境

4.1 実行環境

項目内容
実行場所ローカル開発環境(開発者PC上)。CI環境ではGitHub Actionsのubuntu-latestランナー上で実行。
バックエンドPython 3.11〜3.12 / FastAPI / SQLAlchemy 2.0 / pytest(asyncio_mode=auto、testpaths=tests)
フロントエンドNode.js 20 / React 19 + TypeScript 5 + Vite 7
API実行方式httpx.ASGITransportによるアプリ内蔵実行(実サーバー起動なしでAPIルートを検証)
データベースユニット/結合テストの多くはDB接続をモック化(_FakeDb等)。実DB接続を要する一部の認証テストは、ローカル環境でgreenletドライバが未導入のため実行不可(既知の制約)。

4.2 使用ツール一覧

ツール用途対象
pytest単体・結合テスト実行backend
httpx(AsyncClient)APIリクエストのシミュレーションbackend
unittest.mock(AsyncMock/MagicMock/patch)外部サービス呼び出しのモック化backend
flake8Pythonコードの静的解析(max-line-length=120)backend
blackPythonコードフォーマットチェック(line-length=120)backend
TypeScript(tsc --noEmit)型検査frontend
ESLintJS/TS Lintチェックfrontend
Vite build本番ビルド確認frontend
Playwright(手動操作)E2E動作の目視確認frontend/全体

4.3 テストデータ方針

5. 合格基準

検査区分合格基準備考
単体・結合テスト(pytest)全件成功(xfail指定分を除く)95項目中、既知の制約によりxfail指定された2件(test_authenticated_access/test_reports_allowed_for_school_plus)を除き、全件成功を合格基準とする。
TypeScript型検査エラー0件npx tsc --noEmit
ESLintエラー0件npm run lint
フロントエンドビルドビルド成功npm run build
flake8指摘0件flake8 . --max-line-length=120
black指摘0件(フォーマット崩れなし)black --check --line-length=120 .
手動E2E確認(新機能3項目)全項目PassTEMU追加申込導線/代理店契約Web同意フォーム/審査ステータスreconcile(3.2参照)。Playwrightによる手動操作で確認する。
既知の制約について:test_authenticated_access・test_reports_allowed_for_school_plusの2件は、ローカル検証環境でDB接続用ドライバ(greenlet)が未導入のためValueErrorが発生し、xfail(想定内失敗)として明示的にマークされている。これは実装不具合ではなく検証環境起因の制約であり、残存リスクとして本書に明記する。CI/本番相当環境でのDB接続確認をもって解消とする。

6. テスト体制と役割

役割担当責任範囲
テスト実施RERISE JAPAN開発チーム(AI開発チーム)単体・結合テストの実装・実行、静的検査の実行、不具合の一次対応
確認・承認平部様テスト結果の最終確認、本番反映可否の承認

6.1 スケジュール

フェーズ内容状態
Phase 9:E2Eテスト改修箇所の結合テスト(本番外部送信なし)完了
Phase 10:本番運用診断TypeScript/ESLint/flake8/black による静的検査完了

改修・機能追加が発生した都度、該当範囲の単体・結合テストを追加し、本書のテスト項目一覧を更新する。

7. 不具合管理ルール

7.1 重要度定義

重要度定義対応期限の目安
致命的本番サービス停止、決済・契約データの欠損や誤送信など、事業運営に直接的な損害を及ぼす不具合即日(検知後24時間以内)
重大主要機能(認証・権限制御・デポジット承認・契約フロー等)が利用できない、または誤った結果を返す不具合2営業日以内
中程度一部機能に不具合があるが代替手段があり、事業運営への直接影響が限定的なもの1週間以内
軽微表示崩れ・文言の誤り等、機能自体には影響しない不具合次回リリースまでに対応

7.2 対応フロー