Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonで スナップショットテスト/ pyconjp2023

kakehashi
October 18, 2023

Pythonで スナップショットテスト/ pyconjp2023

kakehashi

October 18, 2023
Tweet

More Decks by kakehashi

Other Decks in Business

Transcript

  1. Copyright © KAKEHASHI Inc. All Rights Reserved. 
 2 お前、誰よ


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

  2. Copyright © KAKEHASHI Inc. All Rights Reserved. 
 3 テストのメンテナンスの悩み


    • 関数の修正時にテストを変更する
 • テストがない関数のテストを作る
 • 返り値が複雑な関数のテストを作る

  3. Copyright © KAKEHASHI Inc. All Rights Reserved. 
 5 スナップショットテストとは?


    • 前回成功時の結果との一致を確認するテスト 

  4. Copyright © KAKEHASHI Inc. All Rights Reserved. 
 7 コスト

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


    • snapshottest
 • syrupy
 • pytest-snapshot (今回紹介)
 • inline-snapshot (今回紹介)

  6. Copyright © KAKEHASHI Inc. All Rights Reserved. 
 9 pytest-snapshot


    • スナップショットをファイルに保存し、それとの比較でテスト 
 • おすすめポイント
 ◦ pytestのプラグインがある。snapshotというfixtureが提供される 
 • スナップショットの更新 
 ◦ pytest --snapshot-update 

  7. Copyright © KAKEHASHI Inc. All Rights Reserved. 
 10 inline-snapshot


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


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


    Copyright © KAKEHASHI Inc. All Rights Reserved. 
 13 • バックエンドエンジニア
 ◦ 新規事業
 ◦ PocketMusubi
 • データエンジニア
 
 絶賛募集中!

  10. Copyright © KAKEHASHI Inc. All Rights Reserved. 
 14 Appendix:

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