Slide 1

Slide 1 text

2023/10/28
 1 Pythonで
 スナップショットテスト
 株式会社カケハシ
 横田 直彦


Slide 2

Slide 2 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 2 お前、誰よ
 ● 横田 直彦
 ● エンジニア歴9年
 ● 株式会社カケハシでTLをしています 
 ○ 薬局業界でのシステム開発 
 ● 普段使いの言語がPythonです 
 ○ 仕事: バックエンド・ETL処理・業務スクリプトなど 
 ○ プライベート: Pythonista3(iPadアプリ)・LLMで遊ぶ 


Slide 3

Slide 3 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 3 テストのメンテナンスの悩み
 ● 関数の修正時にテストを変更する
 ● テストがない関数のテストを作る
 ● 返り値が複雑な関数のテストを作る


Slide 4

Slide 4 text

4 スナップショットテストで解決!


Slide 5

Slide 5 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 5 スナップショットテストとは?
 ● 前回成功時の結果との一致を確認するテスト 


Slide 6

Slide 6 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 6 具体例


Slide 7

Slide 7 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 7 コスト 忠実性 スナップショットテストをいつ使うか
 ● メリット
 ○ 簡単にテストの作成・更新ができる 
 ● デメリット
 ○ 誤ったテストを作りがち
 ○ 日付など実行毎に値が変化する場合に書きづらい 
 ● いつ使うのが良い?
 ○ 仕様が頻繁に変わる関数の回帰テスト 
 ○ テストがない関数のリファクタリングしたい時 
 ○ 関数のレスポンスが複雑な時
 ○ -> 主に統合テストで有効
 ● 具体例
 ○ APIのレスポンスのテスト
 ■ レスポンスのjson
 ○ ETL処理の集計関数のテスト
 ■ 行列データのcsv
 単体 統合 E2E テストケース数 テストピラミッド 実行速度 決定性 統合テストの 工数削減 に使える

Slide 8

Slide 8 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 8 Pythonのライブラリを紹介
 ● snapshottest
 ● syrupy
 ● pytest-snapshot (今回紹介)
 ● inline-snapshot (今回紹介)


Slide 9

Slide 9 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 9 pytest-snapshot
 ● スナップショットをファイルに保存し、それとの比較でテスト 
 ● おすすめポイント
 ○ pytestのプラグインがある。snapshotというfixtureが提供される 
 ● スナップショットの更新 
 ○ pytest --snapshot-update 


Slide 10

Slide 10 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 10 inline-snapshot
 ● スナップショットをテストコード上に保存 し、それとの比較でテスト 
 ● おすすめポイント
 ○ pytestのプラグインがある。parametrizedテストでも使える 
 ● スナップショットの更新 
 pytest --inline-snapshot=create
 で自動的にテストコードが修正される

Slide 11

Slide 11 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 11 スナップショットテストの保存場所による使い分け
 スナップショットの場所 ファイル インライン(テストコード) メリット テストコードがシンプルになる 結果の差分をgit diffで確認できる 余計なファイルが増えない デメリット assertごとにファイルが生成 テストコードが難読化 使い所 関数の結果が大きい場合 関数の結果が小さい場合

Slide 12

Slide 12 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 12 スナップショットテストで
 簡単に
 システムの品質を改善しよう!


Slide 13

Slide 13 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 13 開発メンバーを募集しています!
 Copyright © KAKEHASHI Inc. All Rights Reserved. 
 13 ● バックエンドエンジニア
 ○ 新規事業
 ○ PocketMusubi
 ● データエンジニア
 
 絶賛募集中!


Slide 14

Slide 14 text

Copyright © KAKEHASHI Inc. All Rights Reserved. 
 14 Appendix: スナップショットテストのTips
 ● 動的に変わる値に対処する 
 ○ パッチで日付の生成関数の返り値を固定する 
 ○ 乱数のシードを固定する 
 ○ スナップショット直前に部分的に削除する 
 ● 失敗時の調査のし易さを改善する 
 ○ ローカルでは失敗させず、とりあえず更新してからdiffを見る 
 ● 具体例
 ○ ETL処理のテスト
 ■ PySparkの処理結果をCSVに変換しスナップショット化 
 ■ 分散処理なので毎回行順が変わるので、ソートしてからcsv化 
 ■ テストコードと結果の一覧性を重視し、インラインに保存 
 ■ 不要な行・列はテスト前に削除 
 ■ 結果の行数が増えないようにテストのケースを分割