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
Pythonで スナップショットテスト/ pyconjp2023
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
KAKEHASHI
PRO
October 18, 2023
Business
2.9k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Pythonで スナップショットテスト/ pyconjp2023
KAKEHASHI
PRO
October 18, 2023
More Decks by KAKEHASHI
See All by KAKEHASHI
SharedWorkerを使ったキャッシュでネイティブアプリに負けないユーザー体験を目指す
kakehashi
PRO
1
91
Honoが叶える!いつでも降りられるLambdalith
kakehashi
PRO
2
250
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.4k
薬剤師(ドメインエキスパート)と一緒に育てる薬局向けAIアシスタント
kakehashi
PRO
2
260
デザイナーとPdMが自分でデプロイする ― Amplify Hosting の PR プレビューで回す仮説検証
kakehashi
PRO
2
220
人を動かすのは時間ではなく、納得感 〜新任EMが入社3ヶ月、組織を2回変えた話〜
kakehashi
PRO
3
680
クラウド上のデータ復旧で見落としがちな制約: 医療系 SaaS の BCP 設計から得た教訓
kakehashi
PRO
0
5.8k
プロダクトだけじゃない、社内プロセスにおける自動化・省力化ノススメ
kakehashi
PRO
1
6k
「軸足」は 固定しなくていい - 熱量と強みで描く、しなやかなキャリアの形
kakehashi
PRO
2
730
Other Decks in Business
See All in Business
トヨタの販売店 DX の最前線で、生成 AI と内製開発で挑む
kintotechdev
0
130
Hubble Company Deck
hubbleinc
0
240
会社説明資料
xinghr
0
3.7k
Corporate Story (GA technologies Co., Ltd.)
gatechnologies
0
1.3k
アッテル会社紹介資料/culture deck
attelu
11
17k
誰かの役に立つアウトプットの作り方〜学びの循環に飛び込もう!
ikuodanaka
10
3.9k
ARI_BXデザイン第2事業ドメイン_事業紹介資料
arid2
0
730
Fullerene Company Deck
fullerene_inc
3
4.7k
01_全社_FLUX採用ピッチ資料_Ver.5.8
flux
13
230k
クリヤマジャパン㈱採用資料
uemura2024
0
9.5k
さまざまなサイズにおける巻き込み方と伝え方 / OSO2026
daiksy
3
940
会社案内資料
auditech2022
0
340
Featured
See All Featured
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
KATA
mclloyd
PRO
35
16k
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
Speed Design
sergeychernyshev
33
2.2k
Rails Girls Zürich Keynote
gr2m
96
14k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
How STYLIGHT went responsive
nonsquared
100
6.3k
Scaling GitHub
holman
464
140k
Become a Pro
speakerdeck
PRO
31
6.3k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Transcript
2023/10/28 1 Pythonで スナップショットテスト 株式会社カケハシ 横田 直彦
Copyright © KAKEHASHI Inc. All Rights Reserved. 2 お前、誰よ
• 横田 直彦 • エンジニア歴9年 • 株式会社カケハシでTLをしています ◦ 薬局業界でのシステム開発 • 普段使いの言語がPythonです ◦ 仕事: バックエンド・ETL処理・業務スクリプトなど ◦ プライベート: Pythonista3(iPadアプリ)・LLMで遊ぶ
Copyright © KAKEHASHI Inc. All Rights Reserved. 3 テストのメンテナンスの悩み
• 関数の修正時にテストを変更する • テストがない関数のテストを作る • 返り値が複雑な関数のテストを作る
4 スナップショットテストで解決!
Copyright © KAKEHASHI Inc. All Rights Reserved. 5 スナップショットテストとは?
• 前回成功時の結果との一致を確認するテスト
Copyright © KAKEHASHI Inc. All Rights Reserved. 6 具体例
Copyright © KAKEHASHI Inc. All Rights Reserved. 7 コスト
忠実性 スナップショットテストをいつ使うか • メリット ◦ 簡単にテストの作成・更新ができる • デメリット ◦ 誤ったテストを作りがち ◦ 日付など実行毎に値が変化する場合に書きづらい • いつ使うのが良い? ◦ 仕様が頻繁に変わる関数の回帰テスト ◦ テストがない関数のリファクタリングしたい時 ◦ 関数のレスポンスが複雑な時 ◦ -> 主に統合テストで有効 • 具体例 ◦ APIのレスポンスのテスト ▪ レスポンスのjson ◦ ETL処理の集計関数のテスト ▪ 行列データのcsv 単体 統合 E2E テストケース数 テストピラミッド 実行速度 決定性 統合テストの 工数削減 に使える
Copyright © KAKEHASHI Inc. All Rights Reserved. 8 Pythonのライブラリを紹介
• snapshottest • syrupy • pytest-snapshot (今回紹介) • inline-snapshot (今回紹介)
Copyright © KAKEHASHI Inc. All Rights Reserved. 9 pytest-snapshot
• スナップショットをファイルに保存し、それとの比較でテスト • おすすめポイント ◦ pytestのプラグインがある。snapshotというfixtureが提供される • スナップショットの更新 ◦ pytest --snapshot-update
Copyright © KAKEHASHI Inc. All Rights Reserved. 10 inline-snapshot
• スナップショットをテストコード上に保存 し、それとの比較でテスト • おすすめポイント ◦ pytestのプラグインがある。parametrizedテストでも使える • スナップショットの更新 pytest --inline-snapshot=create で自動的にテストコードが修正される
Copyright © KAKEHASHI Inc. All Rights Reserved. 11 スナップショットテストの保存場所による使い分け
スナップショットの場所 ファイル インライン(テストコード) メリット テストコードがシンプルになる 結果の差分をgit diffで確認できる 余計なファイルが増えない デメリット assertごとにファイルが生成 テストコードが難読化 使い所 関数の結果が大きい場合 関数の結果が小さい場合
Copyright © KAKEHASHI Inc. All Rights Reserved. 12 スナップショットテストで
簡単に システムの品質を改善しよう!
Copyright © KAKEHASHI Inc. All Rights Reserved. 13 開発メンバーを募集しています!
Copyright © KAKEHASHI Inc. All Rights Reserved. 13 • バックエンドエンジニア ◦ 新規事業 ◦ PocketMusubi • データエンジニア 絶賛募集中!
Copyright © KAKEHASHI Inc. All Rights Reserved. 14 Appendix:
スナップショットテストのTips • 動的に変わる値に対処する ◦ パッチで日付の生成関数の返り値を固定する ◦ 乱数のシードを固定する ◦ スナップショット直前に部分的に削除する • 失敗時の調査のし易さを改善する ◦ ローカルでは失敗させず、とりあえず更新してからdiffを見る • 具体例 ◦ ETL処理のテスト ▪ PySparkの処理結果をCSVに変換しスナップショット化 ▪ 分散処理なので毎回行順が変わるので、ソートしてからcsv化 ▪ テストコードと結果の一覧性を重視し、インラインに保存 ▪ 不要な行・列はテスト前に削除 ▪ 結果の行数が増えないようにテストのケースを分割