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
Mocking in Rust Applications
Search
taiki45
September 10, 2024
Technology
2
610
Mocking in Rust Applications
Talk at "RustのWebアプリ開発 LT道場 〜テスト編〜"
https://findy.connpass.com/event/327824/
taiki45
September 10, 2024
Tweet
Share
More Decks by taiki45
See All by taiki45
Error Handling in Rust Applications
taiki45
3
650
Efficient Platform for Security and Compliance
taiki45
4
1.5k
RustでAWS Lambda functionをいい感じに書く
taiki45
2
670
SPIFFE Meetup Tokyo #2 LT: Envoy SDS
taiki45
0
770
builderscon Tokyo 2019: Intro Service Mesh
taiki45
6
3.4k
NoOps Meetup Tokyo #7: 入門サービスメッシュ
taiki45
4
1.9k
CloudNative Days Tokyo 2019: Understanding Envoy
taiki45
3
3.5k
Cloud Native Meetup Tokyo #8 ServiceMesh Day Recap
taiki45
2
390
EnvoyCon 2018: Building and operating service mesh at mid-size company
taiki45
3
4.5k
Other Decks in Technology
See All in Technology
MCP認可の現在地と自律型エージェント対応に向けた課題 / MCP Authorization Today and Challenges to Support Autonomous Agents
yokawasa
5
1.7k
マルチモーダル基盤モデルに基づく動画と音の解析技術
lycorptech_jp
PRO
4
500
AI コードレビューが面倒すぎるのでテスト駆動開発で解決しようとして読んだら、根本的に俺の勘違いだった
mutsumix
0
160
オブザーバビリティプラットフォーム開発におけるオブザーバビリティとの向き合い / Hatena Engineer Seminar #34 オブザーバビリティの実現と運用編
arthur1
0
340
Kiroから考える AIコーディングツールの潮流
s4yuba
4
660
マルチプロダクト×マルチテナントを支えるモジュラモノリスを中心としたアソビューのアーキテクチャ
disc99
0
260
2時間で300+テーブルをデータ基盤に連携するためのAI活用 / FukuokaDataEngineer
sansan_randd
0
130
【新卒研修資料】数理最適化 / Mathematical Optimization
brainpadpr
25
11k
GMOペパボのデータ基盤とデータ活用の現在地 / Current State of GMO Pepabo's Data Infrastructure and Data Utilization
zaimy
3
190
Mambaで物体検出 完全に理解した
shirarei24
2
210
【OptimizationNight】数理最適化のラストワンマイルとしてのUIUX
brainpadpr
0
150
クマ×共生 HACKATHON - 熊対策を『特別な行動」から「生活の一部」に -
pharaohkj
0
290
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
53
7.7k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
21
1.4k
Documentation Writing (for coders)
carmenintech
73
5k
Being A Developer After 40
akosma
90
590k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Embracing the Ebb and Flow
colly
86
4.8k
It's Worth the Effort
3n
185
28k
Unsuck your backbone
ammeep
671
58k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Git: the NoSQL Database
bkeepers
PRO
431
65k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Transcript
© 2024 Finatext Holdings Ltd. Mocking in Rust Applications Taiki
Ono, Finatext
© 2024 Finatext Holdings Ltd. Taiki Ono @taiki45 1
None
© 2024 Finatext Holdings Ltd. 1. モックするまでの道のり 2. モックを定義する・使う 例として使ったコードは
https://github.com/Finatext/orgu に全貌あります 今回の話は単体テストくらいの粒度のテストをスコープにしています 目次 3
© 2024 Finatext Holdings Ltd. モックするまでの道のり 4
© 2024 Finatext Holdings Ltd. テスト対象のロジックは外部依存について差し替え可能であることが望ましいです(後述) Rustでは交換可能性はGenericsまたはTrait Objectsを使って実現できます • Generics
(+ Trait Bounds): コンパイル時に具体的な型が分かるケースで利用します。コンパイラがそれぞ れの具体的な型用のコードを生成する。静的ディスパッチ • Trait Objects: コンパイル時に具体的な型が分からないケースで利用します。実行時のメソッド呼び出し時 に仮想関数テーブルを参照して実際の呼び出し関数(メソッド)を決定します。動的ディスパッチ 交換可能性を導入する 5
© 2024 Finatext Holdings Ltd. 非同期ジョブのロジックという例: 「GitHub Checks APIを使ってCheckRunを作成して、Git cloneでリポジトリをクローンして、指定された外部
コマンドを実行する」 テスト時にモックしたい部分 • GitHub APIを呼ぶ: GithubClient trait • Git clone: Checkout trait →このケースでは例えば、Handlerという構造体を定義してそれぞれの外部依存を持たせる 交換可能性の例 6
© 2024 Finatext Holdings Ltd. 静的ディスパッチのアプローチ: GithubClient trait 7
© 2024 Finatext Holdings Ltd. 静的ディスパッチのアプローチ: Checkout trait 8
© 2024 Finatext Holdings Ltd. 静的ディスパッチのアプローチ: Handler 9
© 2024 Finatext Holdings Ltd. 静的ディスパッチのアプローチ: Handlerの初期化関数 10
© 2024 Finatext Holdings Ltd. 静的ディスパッチのアプローチ: ドメインロジック 11
© 2024 Finatext Holdings Ltd. 静的ディスパッチのアプローチ: 初期化 12
© 2024 Finatext Holdings Ltd. 静的ディスパッチのアプローチ: テスト時の初期化 13
© 2024 Finatext Holdings Ltd. 動的ディスパッチのアプローチ: Handler定義 14 ※動的ディスパッチ
© 2024 Finatext Holdings Ltd. 動的ディスパッチのアプローチ: 初期化 15
© 2024 Finatext Holdings Ltd. ケースバイケース Webアプリケーションの場合はIOの方がはるかにでかいので、生産性その他で決めるといいです 静的ディスパッチ vs 動的ディスパッチ
16
© 2024 Finatext Holdings Ltd. axum crateのStateのような仕組みを使う http crateのRequest構造体にはexstensionの仕組みがあるので、このexstensionに状態を毎回セットする tower::Serviceを作ると同じようなことが実現できる(はず)
ある程度の規模以上だと依存管理が煩雑になりそうなのでDependency Injdectionライブラリが有効そうだが少な い。DIパターンもデファクトがあるわけではなさそうなので今後の発展に期待(っぽい) Webアプリケーションでの交換可能性の実現 17
© 2024 Finatext Holdings Ltd. Webアプリケーションでの交換可能性の実現 18
© 2024 Finatext Holdings Ltd. モックを定義する・使う 19
© 2024 Finatext Holdings Ltd. • #[automock] ◦ 先の例のような典型的なケースではこのattribute macroで自動生成する
• mock! ◦ #[automock]マクロではダメなケースでこのproc macroで半手動(?)で生成する 名前に "Mock" prefixが付いた構造体が定義されるので、::newか::defaultで構造体を初期化する モック構造体の専用のメソッドを使ってモック対象のtraitのメソッド呼び出しのexpectationを設定する Expectation設定用のメソッド名は "expect_<original_method_name>" という規約 デストラクタで設定されたexpectationを検証する mockall crate 20
© 2024 Finatext Holdings Ltd. 例: モック定義 21
© 2024 Finatext Holdings Ltd. 例: モックを使う 22
© 2024 Finatext Holdings Ltd. 例: メソッドの引数の検証 23
© 2024 Finatext Holdings Ltd. • 構造体の実装のモックはできるが名前空間上でハック(?)が必要でやや微妙 ◦ 後述 •
Associated functions(static methods?)のモックはexpectationの設定がグローバルになるので、テスト の並列実行で同期ロジックが必要 ◦ なるべく避けたい • モジュール上の関数もモック可能だが名前空間上のハックが必要、かつexpectationの設定がグローバルにな る ◦ なるべく避けたい • モック対象のtraitのメソッドが参照を返す場合は制限あり • モック対象のtraitのメソッドの返り値がimpl Traitの場合は、mockall内部でBox<dyn Trait>に変換するの で制限あり • モック対象のtraitのメソッドの返り値がimpl Futureの場合は、返り値をpinningする必要あり ◦ 実際はasyncキーワードとasync-trait crateを使うことが多い(?) ◦ 後述 ドキュメントとexamplesがかなり丁寧でその他のケースも網羅してるので困った時はどうぞ mockallの注意点 24
© 2024 Finatext Holdings Ltd. async_traitマクロの手前にautomockマクロを置く。言い換えると、async_traitマクロで書き換えられた後の コードに対してautomockマクロでモック生成する async_traitマクロがその名前でimportされている必要あり。内部で使っているっぽい async-trait crateとの併用
25
© 2024 Finatext Holdings Ltd. 構造体の実装のモック 26
© 2024 Finatext Holdings Ltd. Associated Functionsの交換 27
© 2024 Finatext Holdings Ltd. 実用Rustアプリケーション開発 28 https://zenn.dev/taiki45/books/pragmatic-rust-application-development
None