Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Enumを自動で網羅的にテストしてみた
Search
estie | エスティ
December 26, 2022
Programming
2.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Enumを自動で網羅的にテストしてみた
estie | エスティ
December 26, 2022
More Decks by estie | エスティ
See All by estie | エスティ
Dropを走らせないRustのメモリ管理
estie
0
3
AI時代 自由なデータ利活用とデータ保護を両立するバックエンド設計
estie
0
22
自社のレビュー履歴からAIコードレビュアーをつくる方法
estie
5
1.8k
ボトルネックは人間 ~その負担をどこまで AI に渡せるか~
estie
0
86
自分の価値が出せる場所に越境せよ
estie
0
170
AIに障害切り分けを全部やってもらった。 。 。 。
estie
1
580
Claude Code の /loop を活用する
estie
0
220
【estie x AI】 AI戦略の現在地と未来
estie
0
140
不動産業界における業界特化のデータ整備とAI活用 ─Vertical DataとVertical AI─
estie
1
1.1k
Other Decks in Programming
See All in Programming
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
490
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
350
Jetpack Compose Mechanisms
skydoves
3
800
R8 の設定見直しでアプリサイズ削減
andpad
0
220
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
990
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
4
2.8k
Simple Storage Service(S3) is not simple
iwatsukayura
0
280
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
490
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
150
sbt 2.0: takeoff
eed3si9n
0
150
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
140
Featured
See All Featured
The Curse of the Amulet
leimatthew05
3
15k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Raft: Consensus for Rubyists
vanstee
142
7.8k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
My Coaching Mixtape
mlcsv
0
350
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
GitHub's CSS Performance
jonrohan
1033
470k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
410
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
340
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
1
280
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Transcript
Enumを自動で網羅的にテストしてみた 2022/11/28 Rust、何もわからない….vol5 riano_ @riano_17
riano_です。 • 2022年8月からestieに参加 • estieではデータ管理サービスを作っています • Rustはestie入社から使い始めました • 趣味で競技プログラミングをしています 1
2 1. データサービスを作る上での不安 2. 楽に網羅的にテストしたい 3. やってみた:3行書き換えればOKになった 4. できなかったこと:1行書けばOKにはできなかった 5.
まとめ 今日の内容
データが壊れたらやばい! (あたりまえ)
4 データを変換しなければ、 入力された文字列をそのままバケツリレーすれば、 よほどのことがない限りミスはない しかし、複雑な不動産データをシンプルに扱うためにはそれではいけない 坪99999円、月1,999,999円、88888円 ... データをシンプルに扱うために(非自明な)構造化が必要
5 データのパターン化をおこなっている (空調設備の例) バックエンドでの構造化の例 バックエンド DB
6 複数回のデータ変換を行う 特に、データベース(MySQL)への書き込み時に符号化を行っている 書き込みと読み取りの順番を間違えて実装してしまったら? 変換を行うからこそ、ミスが生じる可能性がある
7 • エラーが起きることもない • 知らないうちにデータが壊れていく • (まさに立ち上げ中のサービスなので) データ列の追加もあれば、項目の追加もある • 全パターンのテストを書く
... ? ミスが起きてしまったら、取り返しがつかない→どうするか?
楽に網羅的にテストしたい!!
9 全てをテストしたいわけではない APIテストなどで全ケース網羅するのはコストが高い 結合テストは重要な挙動を、単体テストはリスクに応じた網羅度で データベースへの読み書きはリスクが高そうな部分 その正しさを保証しながら、開発スピードを維持できる方法はないか? 正しさの保証と、開発スピードを両立させたい
10 例えば、for ループのように書けてしまえば、 定型文を書くだけ&項目が増えても自動的にテストが対応してくれる 例えばこんなことができればいいな
やってみる
12 使ったもの • 既存の開発環境(sqlx, MySQL) • every_variantというcrate (https://github.com/TotalKrill/every_variant) crateを1つ導入してやってみた
(再掲:EveryVariantマクロを定義しておく) 13 Enum型への実装例
テストの例: Building構造体の中で 空調のパターンを 全てテストしている 14 Enum型への実装例
テスト結果: 15 Enum型への実装例
16 実は類似の機能を持つクレートが他にもあったが、選んだ理由 • 数値や文字列を持つenumに対応している • enumやoptionを含む構造体にも適用できる このcrateを選んだ理由、メリットについて
メンバーにEnum型を持つやや複雑な構造体にも適用可能 17 やや複雑な構造体でやってみる
同じようにテスト可能 18 1つ上位の構造体でやってみる
テスト結果: 19 1つ上位の構造体でやってみる
20 ちなみに、どんな原理でやっているの? →Enumを構文解析して、vectorにpushするマクロを生成 (マクロを生成する関数の先頭部分) 原理を調べてみる
21 • proc_macroによる生成について(実例あり) https://qiita.com/yagince/items/546d86588aaa3fdb3c94 • もう少し詳しめに、synクレートやquoteクレートも紹介 https://techracho.bpsinc.jp/yoshi/2020_12_24/102304 参考文献の紹介
22 • 構造体の名前を返す関数をマクロで作成 ちょっと手を動かしてみる
23 • フィールド名と その型を取得 ちょっと手を動かしてみる
24 • このように動作する →これをめちゃめちゃ 発展させると、 Every_variantになる ちょっと手を動かしてみる
コピペして3行書き換えれば テスト完了!!
26 関数に構造体を渡せば1行でテスト完了!なら理想 ... 構造体をテンプレート化することはできる フィールド名を変数として扱うにはマクロが必要そうだが、 マクロに別の箇所で定義した関数を盛り込むのが難しそう... 何もわからないので、教えてください! 関数化して1行で書けるようにできれば理想だった
安心感と省力化を追い風に 開発を加速させます! (やることは無限にあるので)
estieではチームメンバーを募集しています!