テスト¶
テストスイートは tests/(pplx_export パッケージ外)にあり、完全にオフラインで動作します。API 形状の
入力は、リポジトリに tests/fixtures/ でコミットされた決定論的なモックデータです。テストはオンラインサービスや
実際のユーザーレベルの設定に依存しません。
このページでは、現在のテストモジュール一覧とコントリビューションの流れを管理します。回帰設計については テストシステムアーキテクチャ、入力データ契約については テストフィクスチャを参照してください。
1. テストの実行¶
uv run pytest tests
pytest は宣言された開発依存関係です。テストスイートは以下を保証します:
- ゼロネットワーク——モック入力はリポジトリに格納済み。ネットワーク向けパスは fake、
tmp_path、monkeypatchでカバーされます。 - 実際のユーザー設定を読み込まない——
tests/conftest.pyは、本番モジュールをインポートする前に プロセスレベルの一時設定を作成し、PPLX_EXPORT_CONFIGを上書きします。その後、各テストは独立したalice/bobプレースホルダ設定を取得し、終了後にプロセスレベルのプレースホルダ設定を復元します。サブプロセスの回帰テストでは、 呼び出し元の設定が存在しないか破損していても、テスト収集が失敗しないことを検証します。 - 高速フィードバック——このプロジェクトでは、2026-07-25 時点で 32 個の
test_*.pyモジュールから 435 件のテストが観測されました。ローカル検証での完全実行は約 13~25 秒です。数値は日付付きのリポジトリスナップショットであり、 開発に伴い増加します。
よく使う選択:
| コマンド | 効果 |
|---|---|
uv run pytest tests |
完全スイート |
uv run pytest tests/test_units.py |
単一モジュール |
uv run pytest tests -k snapshot |
node id が snapshot に一致するテスト |
uv run pytest tests -x -q |
最初の失敗で停止、静かな出力 |
uv run pytest --collect-only -q |
収集ケース数を更新 |
2. 現在のモジュール一覧¶
一覧は 2026-07-27 にリポジトリと同期済み:
| 機能ファミリ | モジュール | 用途 |
|---|---|---|
| レンダリングスナップショット | test_render_snapshots.py |
すべてのモックされた完全モードと簡略シナリオフィクスチャを再レンダリングし、コミット済み成果物とバイト単位で比較 |
| コアと共有ユーティリティ | test_units.py |
状態、スロットリング、計画、正規化、アセット命名、モード判定、安全なパス、およびクロスカッティング回帰 |
| ドキュメント契約、スキル、ローカライゼーション | test_agent_skills.pytest_audit_docs.pytest_translate_docs.py |
リポジトリローカルスキル契約、および読み取り専用ドキュメント監査人と機械翻訳パイプライン向けの隔離されたミニリポジトリテスト |
| 設定、認証、初期化 | test_config_external.pytest_cookie_profiles.pytest_credential.pytest_init.py |
外部設定の隔離、クッキー由来の設定、資格情報の選択と初期化 |
| レンダリングとワークフローセマンティクス | test_interruptions.pytest_stub_workflows.pytest_answer_variants.pytest_answer_variant_logging.pytest_relations.py |
ワークフローの帰属、中断状態、回答バリアント、監査ログ、関係エッジ |
| オフラインアーカイブとインデックスメンテナンス | test_search_mode_backfill.pytest_sync_deleted.pytest_status.py |
エンリッチメント、再実行/べき等動作、クロスアカウント削除判定、最終状態、およびオフライン状態台帳/変更レポートの階層出力 |
| レビュー回帰 | 下表に示す 16 個の test_fix_*.py モジュール |
レビュー発見に由来する修正。モジュール名はレビューの lineage を保持 |
2.1 レビュー回帰 lineage¶
レビュー番号は回帰テストが存在する理由を説明しますが、テストスイートの主要なアーキテクチャではありません。マッピングは多対多を明示的に許可します: 1 つのモジュールが複数の発見をカバーすることも、1 つの発見が既存のトピックモジュールにテストケースを追加することもあります。
| Lineage | 専用モジュール |
|---|---|
| N ラウンドレビュー | test_fix_n01_inline_assets.py、test_fix_n02_spaces_link.py、test_fix_n03_n12.py、test_fix_n04_cookies.py、test_fix_n05_n06_n09.py、test_fix_n07_usage_checkpoint.py、test_fix_n08_throttle_overflow.py、test_fix_n10_table_header.py、test_fix_n11_batch_total.py |
| V3 ラウンドレビュー | test_fix_v301_nested_sources_text.py、test_fix_v305_export_products.py |
| V4 ラウンドレビュー | test_fix_v401_thread_dir_migration.py、test_fix_v402_manifest_count.py、test_fix_v403_handle_assets_idempotency.py、test_fix_v405_ask_post_steps.py |
| V5 ラウンドレビュー | test_fix_v5_review.py、および既存のトピックモジュールへのピンポイント追加 |
| V6 ラウンドレビュー | test_fix_v6_atomic_writes.py |
各モジュールの docstring は、対応する発見の以前の動作、修正された動作、および回帰境界に関する信頼できる情報源です。
3. スナップショットテストが本番再レンダリングパスを再利用する方法¶
スナップショットテストは別のレンダラーを実装しません:
tests/conftest.py内のrender_fixtureが、フィクスチャのモックされたraw_entries.json、オプションのraw_blocks.json、thread.jsonを一時ディレクトリにコピーします。- それは
pplx_export.commands.rerender_cmd.rerenderを呼び出します。これはpplx-export re-renderが使用するのと同じ関数です。 renderedフィクスチャファクトリは、新しい出力とフィクスチャ内のコミット済みgolden/ディレクトリを返します。- テストは
conversation.mdとすべてのturns/turn_*.mdをバイト単位で比較します。
バイト等価性に加えて、コンテンツ不変条件があります:回答が空のプレースホルダ (无) に退化してはならず、{'type': ...
のような dict-repr の残骸がレンダリングテキストに漏れてはなりません。
4. 新しいテストの追加¶
- 既存のロジック——対応するトピックモジュールにテストを追加します。
tmp_path、fake、monkeypatchを使用します。ネットワークや実際の~/.configにアクセスしてはいけません。 - バグ回帰——優先的に対応するトピックモジュールに追加します。レビュー lineage を保持することでトレーサビリティが明らかに向上する場合にのみ、
新しい
test_fix_<lineage>_<slug>.pyを作成します。1 つの発見が 1 つのモジュールに対応すると想定しないでください。 - レンダリング回帰——新しいモックフィクスチャを追加するか、既存のものを簡略化し、メンテナンスツールで golden を再生成し、
それを
test_render_snapshots.pyに登録するか、シナリオ固有のアサーションを追加します。
周囲のコードスタイルに従います:型アノテーション、from __future__ import annotations、およびバイリンガルモジュールの
docstring。
5. 関連項目¶
- テストフィクスチャ——モック入力、golden 成果物、メンテナンス契約
- テストシステムアーキテクチャ——テスト階層と回帰保証
- オフライン操作——スナップショットテストが再利用する本番再レンダリングパス