Upgrade to Pro — share decks privately, control downloads, hide ads and more …

階層化自動テストで開発に機動力を

Avatar for ICKX ICKX
July 18, 2025

 階層化自動テストで開発に機動力を

Avatar for ICKX

ICKX

July 18, 2025
Tweet

More Decks by ICKX

Other Decks in Programming

Transcript

  1. 自己紹介 • 若葉 章(わかば あきら) • 2010年~ 同人ソフトサークル project ickx

    • プロデューサー / 営業 / インフラ / サーバサイド... / ゲームの実開発以外全部 • 本職はスタッフエンジニアっぽいこともするphpエンジニア • php続けてもうすぐ25年 php3の頃からお世話になっています • 最近の趣味は自転車とコーヒーとアマチュア無線 • tyrell iveで京阪や徳島から高松まで走ったり、icom ic-705やID-52で移動運用試したり • ボトルゲージ用のアルミステーやドリッパーホルダの自作を始めましたもうだめだ • Nintendo Switch で『VERTICAL STRIKE ENDLESS CHALLENGE』販売中 • Qiitaで『phpで高速に・省メモリ・確実に日本語csvを扱う方法』公開中 https://qiita.com/wakabadou/items/84b48ca12f25fb2fb69c 「composer require fw3/streams」をよろしくね。 「composer require tacddd/tacddd」もよろしくね。 「composer require bypassflow/crypt 」もよろしくね。
  2. • 状態 • 特定条件における出力内容を状態と定義します • テストとして関心事は特定条件における出力内容の妥当性 • テスト開始条件は固定され、結果には冪等性を要求します • そのため、前後URLなどのフローに関する内容は関知しません

    • フロー • 関連する複数の状態を横断するものをフローと定義します • テストとしての関心事は適切にフローを流せるか • その際のチェックポイントとして一部の状態をテストすることも ありますが、チェックポイント以外の状態は関知しません
  3. • フローとして見るべきもの • セッション・永続化を伴う複数URLへの一環した操作 • リクエスト受け付けから出力までの処理コールツリー • 状態として見るべきもの • 単一URLリクエストに対するレスポンス

    • 単一URLリクエストにおける検証処理 • 単一URLリクエストにおける変数割り当て • クラス、関数に対する入力と出力 E2Eで カバー xUnitで カバー
  4. • 複数リクエストの集約が必要 • セッション・永続化を伴う複数URLへの一環した操作 • 単一リクエストで完結できる • 単一URLリクエストに対するレスポンス • 変数値の確認で完結できる

    • リクエスト受け付けから出力までの処理コールツリー • 単一URLリクエストにおける検証処理 • 単一URLリクエストにおける変数割り当て • クラス、関数に対する入力と出力
  5. フローとして見るべきもの 状態として見るべきもの 複数リクエストの集約が必要 • セッション・永続化を伴う複数URLへの一環した操作 単一リクエストで完結できる • 単一URLリクエストに対するレスポンス 変数値の確認で完結できる •

    リクエスト受け付けから出力までの処理コールツリー • 単一URLリクエストにおける検証処理 • 単一URLリクエストにおける変数割り当て • クラス、関数に対する入力と出力 マトリクスにするとこんな感じ
  6. フローとして見るべきもの 状態は強く意識せず、フローだけをテスト 状態として見るべきもの フローは意識せず、状態だけをテスト 複数リクエストの集約が必要 • セッション・永続化を伴う複数URLへの一環した操作 単一リクエストで完結できる • 単一URLリクエストに対するレスポンス

    変数値の確認で完結できる • リクエスト受け付けから出力までの処理コールツリー • 単一URLリクエストにおける検証処理 • 単一URLリクエストにおける変数割り当て • クラス、関数に対する入力と出力 関心事を”テストで見るべきもの”にした場合
  7. フローとして見るべきもの 状態は強く意識せず、フローだけをテスト 状態として見るべきもの フローは意識せず、状態だけをテスト 複数リクエストの集約が必要 E2E以外では実現困難 • セッション・永続化を伴う複数URLへの一環した操作 単一リクエストで完結できる 状況によりE2E、xUnit使い分け

    • 単一URLリクエストに対するレスポンス 変数値の確認で完結できる xUnitのみで完結できる • リクエスト受け付けから出力までの処理コールツリー • 単一URLリクエストにおける検証処理 • 単一URLリクエストにおける変数割り当て • クラス、関数に対する入力と出力 関心事を”テストを完結できる単位”にした場合
  8. • 複数リクエストの集約が必要 • セッション・永続化を伴う複数URLへの一環した操作 • 単一リクエストで完結できる • 単一URLリクエストに対するレスポンス • 変数値の確認で完結できる

    • リクエスト受け付けから出力までの処理コールツリー • 単一URLリクエストにおける検証処理 • 単一URLリクエストにおける変数割り当て • クラス、関数に対する入力と出力 フローが妥当に流れること
  9. • 複数リクエストの集約が必要 • セッション・永続化を伴う複数URLへの一環した操作 • 単一リクエストで完結できる • 単一URLリクエストに対するレスポンス • 変数値の確認で完結できる

    • リクエスト受け付けから出力までの処理コールツリー • 単一URLリクエストにおける検証処理 • 単一URLリクエストにおける変数割り当て • クラス、関数に対する入力と出力 状態が妥当であること
  10. • 複数リクエストの集約が必要 • セッション・永続化を伴う複数URLへの一環した操作 • 単一リクエストで完結できる • 単一URLリクエストに対するレスポンス • 変数値の確認で完結できる

    • リクエスト受け付けから出力までの処理コールツリー • 単一URLリクエストにおける検証処理 • 単一URLリクエストにおける変数割り当て • クラス、関数に対する入力と出力 フローが妥当に流れること
  11. • 複数リクエストの集約が必要 • セッション・永続化を伴う複数URLへの一環した操作 • 単一リクエストで完結できる • 単一URLリクエストに対するレスポンス • 変数値の確認で完結できる

    • リクエスト受け付けから出力までの処理コールツリー • 単一URLリクエストにおける検証処理 • 単一URLリクエストにおける変数割り当て • クラス、関数に対する入力と出力 状態が妥当であること
  12. • URLをまたぐフローにのみ関心を持ちます • URLごとの詳細な状態は他テスト階層で 保証されます • 結果、フロー変更の影響を局限できます • MPAならとてもシンプルですね •

    入力 => 確認 => 完了 => 結果確認 の流れだけ • 入力で入れた内容が確認で出力され • セッションに入った内容が完了で反映され • 反映された内容が結果画面で確認できること
  13. 階層化自動テストとは • 境界付けられたコンテキストに応じてテストを分割する • テストの関心事を見るべきものと完結できる単位で分割する • テストで見るべきものをフローと状態に分割する • 階層テストはそれぞれ独立して機能する •

    階層テストはプロセスに要求されるコンテキストの有無で増減する • ツールの謳う使い方に囚われない • 上記を満たし、実施される自動テストが階層化自動テストである
  14. • セッション・永続化を伴う複数URLへの一環した操作 • 単一URLリクエストに対するレスポンス • リクエスト受け付けから出力までの処理コールツリー • 単一URLリクエストにおける検証処理 • 単一URLリクエストにおける変数割り当て

    • クラス、関数に対する入力と出力 画面遷移 のみ担当 画面描画 のみ担当 プログラムコール ツリーのみ担当 HTTP入力検証 のみ担当 アクションが生成 する変数のみ担当 処理の入出力 のみ担当
  15. • セ ッ シ ョ ン ・ 永 続 化

    を 伴 う 複 数 U R L へ の 一 環 し た 操 作 • 単 一 U R L リ ク エ ス ト に 対 す る レ ス ポ ン ス • リ ク エ ス ト 受 け 付 け か ら 出 力 ま で の 処 理 コ ー ル ツ リ ー • 単 一 U R L リ ク エ ス ト に お け る 検 証 処 理 • 単 一 U R L リ ク エ ス ト に お け る 変 数 割 り 当 て • ク ラ ス 、 関 数 に 対 す る 入 力 と 出 力 リリース前 受け入れ前 PR前 コミット 単位 作業 単位 作業 単位 上書き 保存単位 テストプロセスフロー
  16. ¥e