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
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
16
なぜ書き込みDBと 読み取りDBを分けるのか?
suzukimar
0
230
緊張をしちゃう人用_のLTのやりかた
suzukimar
1
90
UseCaseクラスを使って FatControllerやFatModelにしない
suzukimar
3
660
ChatGPT にいる 9人の生成AIロールとの日常
suzukimar
1
440
CQRS/ESのクラスとシステムフロー ~ RailsでフルスクラッチでCQRSESを組んで みたことから得た学び~
suzukimar
0
490
バイブコーディング_TDD.pdf
suzukimar
0
220
RailsでCQRS/ESをやってみたきづき
suzukimar
2
2.4k
ドメイン駆動設計の考えをもとに競合優位性や アウトカムを得る
suzukimar
0
280
Other Decks in Programming
See All in Programming
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
260
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
7.8k
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
370
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
610
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
13
6.2k
Performance Engineering for Everyone
elenatanasoiu
0
210
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
230
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
740
Vite+ Unified Toolchain for the Web
naokihaba
0
340
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
130
Agentic UI
manfredsteyer
PRO
0
190
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
160
Featured
See All Featured
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Producing Creativity
orderedlist
PRO
348
40k
Building Applications with DynamoDB
mza
96
7.1k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
310
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
Leo the Paperboy
mayatellez
7
1.9k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
Become a Pro
speakerdeck
PRO
31
6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.5k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
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!