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
Enumを自動で網羅的にテストしてみた
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
estie | エスティ
December 26, 2022
Programming
0
2.6k
Enumを自動で網羅的にテストしてみた
estie | エスティ
December 26, 2022
Tweet
Share
More Decks by estie | エスティ
See All by estie | エスティ
来期の評価で変えようと思っていること 〜AI時代に変わること・変わらないこと〜
estie
0
97
dbt×Snowflakeで始めるデータコンペ
estie
0
71
企業価値に繋がるAI事業の創り方
estie
2
3.2k
データの価値を最大化する DaaSのUIデザイン
estie
0
300
エンジニアリングをやめたくないので問い続ける
estie
3
1.5k
第2回 国⼟交通省データコンペ参加者向け勉強会 Snowflake x estie編
estie
1
550
マルチプロダクトを支えるスケーラブルなデータパイプライン設計
estie
1
7.4k
Platformに“ちょうどいい”責務ってどこ? 関心の熱さにあわせて考える、責務分担のプラクティス
estie
2
910
事業価値を作る「攻めるPM、守るPM」
estie
0
240
Other Decks in Programming
See All in Programming
Nuxt Server Components
wattanx
0
120
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
1.1k
nuget-server - あなたが必要だったNuGetサーバー
kekyo
PRO
0
450
The free-lunch guide to idea circularity
hollycummins
0
350
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
240
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
2
410
Migration to Signals, Signal Forms, Resource API, and NgRx Signal Store @Angular Days 03/2026 Munich
manfredsteyer
PRO
0
150
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.4k
ネイティブアプリとWebフロントエンドのAPI通信ラッパーにおける共通化の勘所
suguruooki
0
180
maplibre-gl-layers - 地図に移動体たくさん表示したい
kekyo
PRO
0
470
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
990
車輪の再発明をしよう!PHP で実装して学ぶ、Web サーバーの仕組みと HTTP の正体
h1r0
2
380
Featured
See All Featured
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
110k
Side Projects
sachag
455
43k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
160
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
Making the Leap to Tech Lead
cromwellryan
135
9.8k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
150
Statistics for Hackers
jakevdp
799
230k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
160
エンジニアに許された特別な時間の終わり
watany
106
240k
Leo the Paperboy
mayatellez
4
1.5k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.1k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
150
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ではチームメンバーを募集しています!