Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
実装パターンとテストパターンの紹介と組み合わせ方
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
suzuki masayuki
September 19, 2023
Programming
250
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
実装パターンとテストパターンの紹介と組み合わせ方
suzuki masayuki
September 19, 2023
More Decks by suzuki masayuki
See All by suzuki masayuki
AIでの開発を楽にするために もう1つAIを使う
suzukimar
0
20
なぜ書き込みDBと 読み取りDBを分けるのか?
suzukimar
0
240
緊張をしちゃう人用_のLTのやりかた
suzukimar
1
100
UseCaseクラスを使って FatControllerやFatModelにしない
suzukimar
3
670
ChatGPT にいる 9人の生成AIロールとの日常
suzukimar
1
440
CQRS/ESのクラスとシステムフロー ~ RailsでフルスクラッチでCQRSESを組んで みたことから得た学び~
suzukimar
0
510
バイブコーディング_TDD.pdf
suzukimar
0
220
RailsでCQRS/ESをやってみたきづき
suzukimar
2
2.4k
ドメイン駆動設計の考えをもとに競合優位性や アウトカムを得る
suzukimar
0
290
Other Decks in Programming
See All in Programming
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
360
AIエージェントで 変わるAndroid開発環境
takahirom
2
680
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
220
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
500
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
110
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
460
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.8k
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
140
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
140
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
210
symfony/aiとlaravel/boost
77web
0
130
Featured
See All Featured
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
390
Thoughts on Productivity
jonyablonski
76
5.2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
250
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
770
Into the Great Unknown - MozCon
thekraken
41
2.6k
Designing for Performance
lara
611
70k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
390
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Transcript
実装パターンとテストパターンの 紹介と組み合わせ方
© 2023 • Azit Inc. 株式会社Azitでラストワンマイル配送サービスの CREW Expressの開発をしているプログラマ 書いた記事 安全にプロダクト品質を改善できる!ほぼ100%のテストカバレッジがある世界
2022年に開発チームのコミュニケーションを改善するためにおこなったこと 理解するのが難しいシステムをドメインモデリングによって生産性をあげた話 (Qiitaのミノ駆動さん QiitaEngineerFesta_設計 のコンテスト受賞) プライベート活動 女子プロレス団体の広報活動 (登録者数が5万人をこえるYouTube チャンネルの運営) 自己紹介 鈴木まー 主な 役割 Rai lsにお ける DDDの 導入 リ ファク タリン グ 社 内勉強会な どを 含めたチームビルデ ィン グ 技術情報発 信 技術的負債が発生しないよ うにする
© 2023 • Azit Inc. LearningDDDの社内勉強会をした中で図をもとにDDDだけ に限らない実装パターンやテスト戦略などの習得に役に立 ちましたのでそれを紹介します 今日話すこと
© 2023 • Azit Inc. 役に立った図
© 2023 • Azit Inc. 今回はDDDをやっていなくても役にたつ ビジネスロジック実装とテスト戦略について話します 今回扱う範囲
© 2023 • Azit Inc. ビジネスロジック の実装
© 2023 • Azit Inc. トランザクションスクリプト アクティブレコード ドメインモデル イベント駆動 ビジネスロジックの実装
© 2023 • Azit Inc. トランザクションスクリプト 単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど
アクティブレコード ドメインモデル イベント駆動 ビジネスロジックの実装
© 2023 • Azit Inc. トランザクションスクリプト 単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど
アクティブレコード クラスをテーブルとして扱い、インスタンスをテーブルの行としてあつかう設計パターン RailsのActiveRecordなどのORMの実装時に利用される ドメインモデル イベント駆動 ビジネスロジックの実装
© 2023 • Azit Inc. トランザクションスクリプト 単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど
アクティブレコード クラスをテーブルとして扱い、インスタンスをテーブルの行としてあつかう設計パターン RailsのActiveRecordなどのORMの実装時に利用される ドメインモデル アクティブレコードでは実装するのが難しい複雑なビジネスロジックとビジネスルールをドメインのクラスで実装する イベント駆動 ビジネスロジックの実装
© 2023 • Azit Inc. トランザクションスクリプト 単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど
アクティブレコード クラスをテーブルとして扱い、インスタンスをテーブルの行としてあつかう設計パターン RailsのActiveRecordなどのORMの実装時に利用される ドメインモデル アクティブレコードでは実装するのが難しい複雑なビジネスロジックとビジネスルールをドメインのクラスで実装する イベント駆動 ドメインモデルなどを利用して外部からのイベントに応じて動作するビジネスロジックを実装 するパターン ビジネスロジックの実装
© 2023 • Azit Inc. 単純な業務ロジックを一つの手続きで完結させるための設計パターンです。このパターンは特 に、データ構造がシンプルで処理が少ない場合や、小規模なプロジェクトに適しています。具 体的な使用例としては、CLIツールやAWS Lambdaのようなサーバーレス関数があります。 この設計パターンの主な利点は、そのシンプリシティと効率性です。短期間での開発が必要な
場合や、複雑なビジネスロジックが不要な場合には、トランザクションスクリプトが非常に有 用です。また、このパターンは「グルーコード」としてもよく用いられ、異なるシステムや サービスを繋げる際にも役立ちます。 ただし、ビジネスロジックが複雑になると、設計が破綻します。そのような場合は、レイヤー アーキテクチャにリファクタをしたほうがいいです トランザクションスクリプト
© 2023 • Azit Inc. この設計パターンでは、クラスをデータベースのテーブルとして扱い、そのインスタンスを テーブルの行として扱います。CRUD操作は、このオブジェクト自体が行います。それにより DBを隠蔽して実装をすることができます アクティブレコードにバリデーションや関連付けを実装してRailsなどのActiveRecordとして 実装をしています
ただアクティブレコードに複雑なビジネスロジックやビジネスルールなどのドメイン知識も実 装をすると肥大化してしまうため、ドメインモデルクラスの実装を考えたほうがいいです アクティブレコード
© 2023 • Azit Inc. ビジネスロジックとビジネスルールなどのドメイン特有のことを実装しています。 内部にORMなどを利用することで、DB層(永続化層)を外部のクラスに移譲をすることでドメ インの実装に専念をすることができます。 DDDにおけるエンティティに該当していて、このクラスにバリューオブジェクトのインスタン
スをもたせる実装が一般的な実装スタイルです。 ただ、クラス関係が複雑になるのでドメインモデルを作成するかアクティブレコードで完結す るかのトレードオフを気にしたほうがいいです。 ドメインモデル
© 2023 • Azit Inc. イベント駆動とは、ユーザーが何かをしたり、システムが何かを感知したりしたときに確実に 動作することを保証する設計パターンです。例えば、銀行でお金を引き出すとき、システムは その動きに反応していろいろな作業をします。これは、何がどこで起きたかをしっかり記録し たい場合や、後で確認したい場合に便利です。 この方法は、いろいろなマイクロサービスが連携して動く場合によく使われます。
ただ、データベースのトランザクション処理について考える必要があるため実装難易度と実装 にかかる時間が多くなってしまいます。 そのため、確実に実行することを保証する実装をする場合だけこの実装方法を利用するのが良 いです イベント駆動
© 2023 • Azit Inc. テスト戦略
© 2023 • Azit Inc. このプレゼンテーションでは、統合テストを「リクエストスペック」とし て扱います。リクエストスペックは、特にRailsなどのWebフレームワーク でよく用いられる考え方で、HTTPリクエストとレスポンスをテストしま す。 これにより、APIやWebアプリケーションのエンドポイントが期待通りに動
作するかを確認します。 その前にここでいう統合テストについて
© 2023 • Azit Inc. テストピラミッド テスティングダイアモンド リバーステストピラミッド テスト戦略
テストピラミッド ユニットテストが最も多く、統合テスト、E2Eテストが次第に少なくなる テスト戦略 テスティングダイアモンド リバーステストピラミッド テスト戦略
© 2023 • Azit Inc. テストピラミッド ユニットテストが最も多く、統合テスト、E2Eテストが次第に少なくなる テスト戦略 テスティングダイアモンド ユニットテストと統合テストが多く、E2Eテストが少なめで、特に統合テ
ストに重点を置くテスト戦略。 リバーステストピラミッド テスト戦略
© 2023 • Azit Inc. テストピラミッド ユニットテストが最も多く、統合テスト、E2Eテストが次第に少なくなる テスト戦略 テスティングダイアモンド ユニットテストと統合テストが多く、E2Eテストが少なめで、特に統合テ
ストに重点を置くテスト戦略。 リバーステストピラミッド E2Eテストが最も多く、統合テスト、ユニットテストが次第に少なくな る、特定の状況のみで有用なテスト戦略。 テスト戦略
© 2023 • Azit Inc. コンテンツ タイトル
© 2023 • Azit Inc. ユニットテストが最も多く、統合テスト、エンドツーエンド(E2E)テストが次第に少なくなります。ア リケーションの開発にも役に立ちますが、一般的なAPIの開発にも有効ですが特にイベント駆動のような複 雑な実装にも有効 ユニットテストが多いことで高速なフィードバックを提供し、E2Eテストが少ないことでテストの実行時 とコストを削減します。
テストピラミッド ユニットテスト E2E 統合テスト
© 2023 • Azit Inc. E2Eテストが最も多く、統合テストとユニットテストが次第に少なくなります。特に、CLIツールのようなイ ンターフェースがあまり変更しない、またはシンプルなアプリケーションのみで有用です。 トランザクションスクリプトは単純な業務ロジックを一つの手続きで完結させるため、全体としての動作確 認が重要です。そのため、E2Eテストが多いリバーステストピラミッドは、このようなシンプルなアプリ ケーションの全体テストに適しています。
リバーステストピラミッド E2E 統合テスト ユニット テスト
© 2023 • Azit Inc. ユニットテストと統合テストが多く、E2Eテストが少なめです。特に、一般的なAPIを実装す るときに統合テストを書くのは有用です。この戦略のメリットは、統合テストが多いことでシ ステムの各部分がうまく連携しているかを確認しやすく、高速なフィードバックが得られる点 です。さらに、統合テストが多いため、シンプルなAPIの実装ではユニットテストを省略する ことも可能です。
テスティングダイアモンド ユニットテスト E2E 統合テスト
© 2023 • Azit Inc. まとめ
© 2023 • Azit Inc. 弊社は様々な技術的話題に詳しいひとや興味を持っている 人を現在の技術スタック関係なく絶賛採用募集中です WE ARE HIRING!