Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

ドメインロジックで考えるテスタビリティ

 ドメインロジックで考えるテスタビリティ

2024/12/04(水) Nihonbashi Test Talk #3『ドメインロジックで考えるテスタビリティ』
https://nihonbashitesttalk.connpass.com/event/334396/

ドメインロジックをどこに配置するべきか、システムのリプレースに際しテストの観点から考え直したお話です。

Tech Leverages

December 04, 2024
Tweet

More Decks by Tech Leverages

Other Decks in Technology

Transcript

  1. | © 2024 Levtech Co., Ltd. 2 レバテック開発部 / ITSプロダクト開発グループ /

    契約請求ドメインチーム 内藤 翔太 SHOTA NAITO ・2023年04月 レバレジーズ株式会社に新卒入社 ・2023年11月 レバテック開発部に異動 ・直近は、システムのリプレースに取り組んでいます!
  2. | © 2024 Levtech Co., Ltd. 3 • はじめに • ドメイン

    / ドメインロジックとは? • ドメインロジックを SQL に含めると? • ドメインロジックをドメインモデルに閉じる • まとめ アジェンダ
  3. | © 2024 Levtech Co., Ltd. 4 • はじめに • ドメイン

    / ドメインロジックとは? • ドメインロジックを SQL に含めると? • ドメインロジックをドメインモデルに閉じる • まとめ アジェンダ
  4. | © 2024 Levtech Co., Ltd. 5 今日伝えたいこと 1. ドメインロジックをドメインモデルに閉じて  

    自動テストしやすい設計を目指しましょう。 2. とはいえ、必ずしもそれが正解になるわけでは   ないので注意しましょう。
  5. | © 2024 Levtech Co., Ltd. 6 • はじめに • ドメイン

    / ドメインロジックとは? • ドメインロジックを SQL に含めると? • ドメインロジックをドメインモデルに閉じる • まとめ アジェンダ
  6. | © 2024 Levtech Co., Ltd. 7 ドメインとは? ドメイン / ドメインロジックとは?

    ドメインとは、ソフトウェアが解決しようとする問題領域 のこと (例: ECサイトなら「注文」「顧客」「商品」など)
  7. | © 2024 Levtech Co., Ltd. 8 ドメインロジックとは? ドメイン / ドメインロジックとは?

    例: 「顧客のロイヤルティポイントに応じて割引率を変える」など • ロイヤルティポイントが 1,000 以上 の場合、注文金額の 10 %割引 • ロイヤルティポイントが 500 以上 1,000 未満 の場合、注文金額の 5 %割引 • ロイヤルティポイントが 500未満 の場合、割引なし ドメインに存在するルールや制約、業務内容を反映した処理
  8. | © 2024 Levtech Co., Ltd. 9 • はじめに • ドメイン

    / ドメインロジックとは? • ドメインロジックを SQL に含めると? • ドメインロジックをドメインモデルに閉じる • まとめ アジェンダ
  9. | © 2024 Levtech Co., Ltd. 10 ドメインロジックを SQL に含めると? 想定するアーキテクチャ

    プレゼンテーション ユースケース ドメイン インフラストラクチャ レイヤードアーキテクチャ with DIP バックエンド
  10. | © 2024 Levtech Co., Ltd. 11 ドメインロジックを SQL に含めると? 実装のイメージ

    プレゼンテーション ユースケース ドメイン インフラストラクチャ ドメインロジック ※ わかりやすさのため $queryRaw を使用
  11. | © 2024 Levtech Co., Ltd. 12 ドメインロジックを SQL に含めると? 実装のイメージ

    プレゼンテーション ユースケース ドメイン インフラストラクチャ
  12. | © 2024 Levtech Co., Ltd. 13 ドメインロジックを SQL に含めると? 単体テストとして書くと...(インフラ層で書くことを想定)

    • データベース環境のセットアップ • 必要なデータ挿入 • クエリ実行と結果検証
  13. | © 2024 Levtech Co., Ltd. 14 ドメインロジックを SQL に含めると? 単体テストとして書くと...(インフラ層で書くことを想定)

    • データベース環境のセットアップ • 必要なデータ挿入 • クエリ実行と結果検証 単体テストでやるにもあまりにフィードバックが遅すぎる... 単体テストの定義 • 1単位の振る舞いを検証すること • 実行時間が短いこと • 他のテスト・ケースから隔離された状態で実行されること 出典: 単体テストの考え方/使い方 p.28
  14. | © 2024 Levtech Co., Ltd. 15 ドメインロジックを SQL に含めると? 単体テストとして書くと...(インフラ層で書くことを想定)

    • データベース環境のセットアップ • 必要なデータ挿入 • クエリ実行と結果検証 単体テストでやるにもあまりにフィードバックが遅すぎる... 単体テストの定義 • 1単位の振る舞いを検証すること • 実行時間が短いこと • 他のテスト・ケースから隔離された状態で実行されること 出典: 単体テストの考え方/使い方 p.28
  15. | © 2024 Levtech Co., Ltd. 16 ドメインロジックを SQL に含めると? 統合テストとして書くと...(ユースケース層で書くことを想定)

    注文ユースケースがこうなっていた場合... ・割引計算ロジック(3 パターン) ・ポイント付与ロジック(4 パターン) ・送料計算ロジック(3 パターン) ・....
  16. | © 2024 Levtech Co., Ltd. 17 ドメインロジックを SQL に含めると? 統合テストとして書くと...(ユースケース層で書くことを想定)

    注文ユースケースがこうなっていた場合... ・割引計算ロジック(3 パターン) ・ポイント付与ロジック(4 パターン) ・送料計算ロジック(3 パターン) ・.... 1. データ準備が膨大になる 条件が掛け算的に増えるため、すべてのパターン を網羅するには膨大なデータセットが必要になる 2. テストの保守コストが上がる 他の処理との結合部分も含めてテストする必要が あるため、修正や原因特定に時間と労力がかかる 3. フィードバックループが長くなる データベースに依存するため、テスト実行時間が 長くなり、効率が低下する ※ DB は、管理下にある依存を想定し、モックしない
  17. | © 2024 Levtech Co., Ltd. 18 ドメインロジックを SQL に含めると? 統合テストとして書くと...(ユースケース層で書くことを想定)

    注文ユースケースがこうなっていた場合... ・割引計算ロジック(3 パターン) ・ポイント付与ロジック(4 パターン) ・送料計算ロジック(3 パターン) ・.... 1. データ準備が膨大になる 条件が掛け算的に増えるため、すべてのパターン を網羅するには膨大なデータセットが必要になる 2. テストの保守コストが上がる 他の処理との結合部分も含めてテストする必要が あるため、修正や原因特定に時間と労力がかかる 3. フィードバックループが長くなる データベースに依存するため、テスト実行時間が 長くなり、効率が低下する ※ DB は、管理下にある依存を想定し、モックしない
  18. | © 2024 Levtech Co., Ltd. 19 ドメインロジックを SQL に含めると? ちなみに本題からは逸れるが他にも...

    1. 再利用性の欠如(新規開発観点) • ドメインロジックは既存のクエリ内に埋め込まれているため、 再利用できず、同じロジックを新しいクエリにも書き直す必要がある 2. 保守性の低下(既存コードの変更観点) • ビジネスルール変更時に、SQL 内で同じロジックを使っている箇所すべてを 手動で修正する必要があり、作業コストやミスのリスクが増大する
  19. | © 2024 Levtech Co., Ltd. 20 • はじめに • ドメイン

    / ドメインロジックとは? • ドメインロジックを SQL に含めると? • ドメインロジックをドメインモデルに閉じる • まとめ アジェンダ
  20. | © 2024 Levtech Co., Ltd. 22 ドメインロジックをドメインモデルに閉じる 実装のイメージ ※ わかりやすさのため

    $queryRaw を使用 プレゼンテーション ユースケース ドメイン インフラストラクチャ
  21. | © 2024 Levtech Co., Ltd. 25 ドメインロジックをドメインモデルに閉じる これにより以下のようなメリットが! 1. テスタビリティの向上

    • ドメインモデル単位の単体テストでドメインロジックを網羅的に検証できるため、 統合テストでは最低限のデータの用意 / ケースの確認で済む • ドメインロジックのテストをデータベースを使用せずに書くことができるので、 フィードバックループが短縮される 2. 再利用性向上(新規開発観点) • 抽出されたロジックは他の機能やコンポーネントでも再利用可能で冗長性や不整合が低減できる 3. 保守性の向上(既存コードの変更観点) • ロジックが一箇所に集約されるため、一貫性が保たれ変更時の影響範囲も明確になり、修正コストが低減できる
  22. | © 2024 Levtech Co., Ltd. 26 ドメインロジックをドメインモデルに閉じる これにより以下のようなメリットが! 1. テスタビリティの向上

    • ドメインモデル単位の単体テストでドメインロジックを網羅的に検証できるため、 統合テストでは最低限のデータの用意 / ケースの確認で済む • ドメインロジックのテストをデータベースを使用せずに書くことができるので、 フィードバックループが短縮される 2. 再利用性向上(新規開発観点) • 抽出されたロジックは他の機能やコンポーネントでも再利用可能で冗長性や不整合が低減できる 3. 保守性の向上(既存コードの変更観点) • ロジックが一箇所に集約されるため、一貫性が保たれ変更時の影響範囲も明確になり、修正コストが低減できる
  23. | © 2024 Levtech Co., Ltd. 27 ドメインロジックをドメインモデルに閉じる つまりどういう状態になったのか? Large 手動テスト

    Medium Small コスト 高 低 速度 速 遅 参考:開発生産性の観点から考える自動テスト(2024/06版) t-wada
  24. | © 2024 Levtech Co., Ltd. 28 ドメインロジックをドメインモデルに閉じる つまりどういう状態になったのか? Large Small

    手動テスト Medium Medium Small Large コスト 高 低 速度 速 遅 参考:開発生産性の観点から考える自動テスト(2024/06版) t-wada
  25. | © 2024 Levtech Co., Ltd. 29 ドメインロジックをドメインモデルに閉じる つまりどういう状態になったのか? Large Small

    手動テスト Medium Medium Small Large コスト 高 低 速度 速 遅 参考:開発生産性の観点から考える自動テスト(2024/06版) t-wada 理想とするテストピラミッドに近づいていってる!
  26. | © 2024 Levtech Co., Ltd. 31 • はじめに • ドメイン

    / ドメインロジックとは? • ドメインロジックを SQL に含めると? • ドメインロジックをドメインモデルに閉じる • まとめ アジェンダ
  27. | © 2024 Levtech Co., Ltd. 32 まとめ • ドメインロジックを SQL

    に含めると、テストのためのデータベースセット アップやデータ準備が必要となり、テストの実行効率が低下する • ドメインロジックをドメインモデルに閉じることで、データベースに依存 しない単体テストが可能になり、テストの保守性と実行効率が向上し、理 想となるテストピラミッドへと近づけることが可能 • ただし、大量データを扱う処理などでは SQL での実装が適している場合も あるため、パフォーマンス要件との兼ね合いを考慮し、ドメインロジック の配置を適切に選択することが重要
  28. | © 2024 Levtech Co., Ltd. 33 今日伝えたいこと 1. ドメインロジックをドメインモデルに閉じて  

    自動テストしやすい設計を目指しましょう。 2. とはいえ、必ずしもそれが正解になるわけでは   ないので注意しましょう。 再掲