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
Pythonで スナップショットテスト/ pyconjp2023
Search
KAKEHASHI
PRO
October 18, 2023
Business
2.8k
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
「軸足」は 固定しなくていい - 熱量と強みで描く、しなやかなキャリアの形
kakehashi
PRO
1
280
Sync と Async ─ useSyncExternalStore を使う者の岐路
kakehashi
PRO
1
540
React Compiler導入の効果と運用の工夫
kakehashi
PRO
3
450
変化の激しい時代をゴキゲンに生き抜くために 〜ストレスマネジメントのススメ〜
kakehashi
PRO
5
2.5k
「SaaSの次の時代」に重要性を増すステークホルダーマネジメントの要諦 ~解像度を圧倒的に高めPdMの価値を最大化させる方法~
kakehashi
PRO
3
4.9k
プロダクトを育てるように生成AIによる開発プロセスを育てよう
kakehashi
PRO
2
2k
チームのモメンタムに投資せよ! 不確実性と共存しながら勢いを生み出す3つの実践
kakehashi
PRO
1
390
FAXが現役の業界でマルチモーダルAIプロダクトを作る
kakehashi
PRO
1
320
EMからVPoEを経てCTOへ:マネジメントキャリアパスにおける葛藤と成長
kakehashi
PRO
9
3.9k
Other Decks in Business
See All in Business
【株式会社ファブリカホールディングス】Company deck
fabrica_com
0
880
株式会社SAFELY 会社紹介 / Company
safely_pr
1
7.4k
株式会社Beer and Tech/HitoHana(ひとはな) 採用資料 2026.06 .09
beerandtech_recruiter
1
49k
5年間コードを書かなかったVPoEが なぜ現場に戻ったのか?
gessy0129
1
230
Decentier_Corporate Deck_2026
decentier
PRO
0
740
01_全社_FLUX採用ピッチ資料_Ver.5.3
flux
10
220k
ラッコ株式会社 システム部 採用情報
mayahoney
0
26k
会社紹介資料
gatechnologies
2
190k
ARI_BXデザイン第2事業ドメイン_事業紹介資料
arid2
0
260
神戸百年記念病院 専門研修PG 2026
kobe100
0
110
mar studio_紹介資料
vinculum
6
130
タケウチグループRecruit
takeuchigroup
0
12k
Featured
See All Featured
A better future with KSS
kneath
240
18k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Evolving SEO for Evolving Search Engines
ryanjones
0
230
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
290
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
400
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Scaling GitHub
holman
464
140k
Exploring anti-patterns in Rails
aemeredith
3
430
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
We Are The Robots
honzajavorek
0
260
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
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化 ▪ テストコードと結果の一覧性を重視し、インラインに保存 ▪ 不要な行・列はテスト前に削除 ▪ 結果の行数が増えないようにテストのケースを分割