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

実装パターンとテストパターンの紹介と組み合わせ方

 実装パターンとテストパターンの紹介と組み合わせ方

suzuki masayuki

September 19, 2023
Tweet

More Decks by suzuki masayuki

Other Decks in Programming

Transcript

  1. 実装パターンとテストパターンの

    紹介と組み合わせ方

    View Slide

  2. © 2023 • Azit Inc.
    株式会社Azitでラストワンマイル配送サービスの

    CREW Expressの開発をしているプログラマ
    書いた記事

    安全にプロダクト品質を改善できる!ほぼ100%のテストカバレッジがある世界

    2022年に開発チームのコミュニケーションを改善するためにおこなったこと

    理解するのが難しいシステムをドメインモデリングによって生産性をあげた話

    (Qiitaのミノ駆動さん QiitaEngineerFesta_設計 のコンテスト受賞)
    プライベート活動

    女子プロレス団体の広報活動

    (登録者数が5万人をこえるYouTube チャンネルの運営)
    自己紹介
    鈴木まー
    主な
    役割

    Rai
    lsにお
    ける
    DDDの
    導入


    ファク
    タリン



    内勉強会な
    どを
    含めたチームビルデ
    ィン


    技術情報発


    技術的負債が発生しないよ
    うにする

    View Slide

  3. © 2023 • Azit Inc.
    LearningDDDの社内勉強会をした中で図をもとにDDDだけ
    に限らない実装パターンやテスト戦略などの習得に役に立
    ちましたのでそれを紹介します

    今日話すこと

    View Slide

  4. © 2023 • Azit Inc.
    役に立った図

    View Slide

  5. © 2023 • Azit Inc.
    今回はDDDをやっていなくても役にたつ

    ビジネスロジック実装とテスト戦略について話します
    今回扱う範囲

    View Slide

  6. © 2023 • Azit Inc.
    ビジネスロジック

    の実装

    View Slide

  7. © 2023 • Azit Inc.
    トランザクションスクリプト



    アクティブレコード



    ドメインモデル



    イベント駆動

    ビジネスロジックの実装

    View Slide

  8. © 2023 • Azit Inc.
    トランザクションスクリプト

    単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど


    アクティブレコード



    ドメインモデル



    イベント駆動

    ビジネスロジックの実装

    View Slide

  9. © 2023 • Azit Inc.
    トランザクションスクリプト

    単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど


    アクティブレコード

    クラスをテーブルとして扱い、インスタンスをテーブルの行としてあつかう設計パターン

    RailsのActiveRecordなどのORMの実装時に利用される


    ドメインモデル



    イベント駆動

    ビジネスロジックの実装

    View Slide

  10. © 2023 • Azit Inc.
    トランザクションスクリプト

    単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど


    アクティブレコード

    クラスをテーブルとして扱い、インスタンスをテーブルの行としてあつかう設計パターン

    RailsのActiveRecordなどのORMの実装時に利用される


    ドメインモデル

    アクティブレコードでは実装するのが難しい複雑なビジネスロジックとビジネスルールをドメインのクラスで実装する


    イベント駆動

    ビジネスロジックの実装

    View Slide

  11. © 2023 • Azit Inc.
    トランザクションスクリプト

    単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど


    アクティブレコード

    クラスをテーブルとして扱い、インスタンスをテーブルの行としてあつかう設計パターン

    RailsのActiveRecordなどのORMの実装時に利用される


    ドメインモデル

    アクティブレコードでは実装するのが難しい複雑なビジネスロジックとビジネスルールをドメインのクラスで実装する


    イベント駆動

    ドメインモデルなどを利用して外部からのイベントに応じて動作するビジネスロジックを実装
    するパターン
    ビジネスロジックの実装

    View Slide

  12. © 2023 • Azit Inc.
    単純な業務ロジックを一つの手続きで完結させるための設計パターンです。このパターンは特
    に、データ構造がシンプルで処理が少ない場合や、小規模なプロジェクトに適しています。具
    体的な使用例としては、CLIツールやAWS Lambdaのようなサーバーレス関数があります。


    この設計パターンの主な利点は、そのシンプリシティと効率性です。短期間での開発が必要な
    場合や、複雑なビジネスロジックが不要な場合には、トランザクションスクリプトが非常に有
    用です。また、このパターンは「グルーコード」としてもよく用いられ、異なるシステムや
    サービスを繋げる際にも役立ちます。


    ただし、ビジネスロジックが複雑になると、設計が破綻します。そのような場合は、レイヤー
    アーキテクチャにリファクタをしたほうがいいです
    トランザクションスクリプト

    View Slide

  13. © 2023 • Azit Inc.
    この設計パターンでは、クラスをデータベースのテーブルとして扱い、そのインスタンスを
    テーブルの行として扱います。CRUD操作は、このオブジェクト自体が行います。それにより
    DBを隠蔽して実装をすることができます


    アクティブレコードにバリデーションや関連付けを実装してRailsなどのActiveRecordとして
    実装をしています


    ただアクティブレコードに複雑なビジネスロジックやビジネスルールなどのドメイン知識も実
    装をすると肥大化してしまうため、ドメインモデルクラスの実装を考えたほうがいいです
    アクティブレコード

    View Slide

  14. © 2023 • Azit Inc.
    ビジネスロジックとビジネスルールなどのドメイン特有のことを実装しています。

    内部にORMなどを利用することで、DB層(永続化層)を外部のクラスに移譲をすることでドメ
    インの実装に専念をすることができます。

    DDDにおけるエンティティに該当していて、このクラスにバリューオブジェクトのインスタン
    スをもたせる実装が一般的な実装スタイルです。


    ただ、クラス関係が複雑になるのでドメインモデルを作成するかアクティブレコードで完結す
    るかのトレードオフを気にしたほうがいいです。
    ドメインモデル

    View Slide

  15. © 2023 • Azit Inc.
    イベント駆動とは、ユーザーが何かをしたり、システムが何かを感知したりしたときに確実に
    動作することを保証する設計パターンです。例えば、銀行でお金を引き出すとき、システムは
    その動きに反応していろいろな作業をします。これは、何がどこで起きたかをしっかり記録し
    たい場合や、後で確認したい場合に便利です。


    この方法は、いろいろなマイクロサービスが連携して動く場合によく使われます。

    ただ、データベースのトランザクション処理について考える必要があるため実装難易度と実装
    にかかる時間が多くなってしまいます。


    そのため、確実に実行することを保証する実装をする場合だけこの実装方法を利用するのが良
    いです
    イベント駆動

    View Slide

  16. © 2023 • Azit Inc.
    テスト戦略

    View Slide

  17. © 2023 • Azit Inc.
    このプレゼンテーションでは、統合テストを「リクエストスペック」とし
    て扱います。リクエストスペックは、特にRailsなどのWebフレームワーク
    でよく用いられる考え方で、HTTPリクエストとレスポンスをテストしま
    す。


    これにより、APIやWebアプリケーションのエンドポイントが期待通りに動
    作するかを確認します。
    その前にここでいう統合テストについて

    View Slide

  18. © 2023 • Azit Inc.
    テストピラミッド



    テスティングダイアモンド



    リバーステストピラミッド


    テスト戦略

    View Slide

  19. テストピラミッド

    ユニットテストが最も多く、統合テスト、E2Eテストが次第に少なくなる

    テスト戦略


    テスティングダイアモンド


    リバーステストピラミッド


    テスト戦略

    View Slide

  20. © 2023 • Azit Inc.
    テストピラミッド

    ユニットテストが最も多く、統合テスト、E2Eテストが次第に少なくなる
    テスト戦略



    テスティングダイアモンド

    ユニットテストと統合テストが多く、E2Eテストが少なめで、特に統合テ
    ストに重点を置くテスト戦略。


    リバーステストピラミッド


    テスト戦略

    View Slide

  21. © 2023 • Azit Inc.
    テストピラミッド

    ユニットテストが最も多く、統合テスト、E2Eテストが次第に少なくなる
    テスト戦略


    テスティングダイアモンド

    ユニットテストと統合テストが多く、E2Eテストが少なめで、特に統合テ
    ストに重点を置くテスト戦略。


    リバーステストピラミッド

    E2Eテストが最も多く、統合テスト、ユニットテストが次第に少なくな
    る、特定の状況のみで有用なテスト戦略。


    テスト戦略

    View Slide

  22. © 2023 • Azit Inc.
    コンテンツ
    タイトル

    View Slide

  23. © 2023 • Azit Inc.
    ユニットテストが最も多く、統合テスト、エンドツーエンド(E2E)テストが次第に少なくなります。ア
    リケーションの開発にも役に立ちますが、一般的なAPIの開発にも有効ですが特にイベント駆動のような複
    雑な実装にも有効


    ユニットテストが多いことで高速なフィードバックを提供し、E2Eテストが少ないことでテストの実行時
    とコストを削減します。
    テストピラミッド
    ユニットテスト
    E2E
    統合テスト

    View Slide

  24. © 2023 • Azit Inc.
    E2Eテストが最も多く、統合テストとユニットテストが次第に少なくなります。特に、CLIツールのようなイ
    ンターフェースがあまり変更しない、またはシンプルなアプリケーションのみで有用です。


    トランザクションスクリプトは単純な業務ロジックを一つの手続きで完結させるため、全体としての動作確
    認が重要です。そのため、E2Eテストが多いリバーステストピラミッドは、このようなシンプルなアプリ
    ケーションの全体テストに適しています。
    リバーステストピラミッド
    E2E
    統合テスト
    ユニット
    テスト

    View Slide

  25. © 2023 • Azit Inc.
    ユニットテストと統合テストが多く、E2Eテストが少なめです。特に、一般的なAPIを実装す
    るときに統合テストを書くのは有用です。この戦略のメリットは、統合テストが多いことでシ
    ステムの各部分がうまく連携しているかを確認しやすく、高速なフィードバックが得られる点
    です。さらに、統合テストが多いため、シンプルなAPIの実装ではユニットテストを省略する
    ことも可能です。

    テスティングダイアモンド
    ユニットテスト
    E2E
    統合テスト

    View Slide

  26. © 2023 • Azit Inc.
    まとめ

    View Slide

  27. © 2023 • Azit Inc.
    弊社は様々な技術的話題に詳しいひとや興味を持っている

    人を現在の技術スタック関係なく絶賛採用募集中です
    WE ARE HIRING!

    View Slide