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. 2023/10/28

    1
    Pythonで

    スナップショットテスト

    株式会社カケハシ

    横田 直彦


    View full-size slide

  2. Copyright © KAKEHASHI Inc. All Rights Reserved.

    2
    お前、誰よ

    ● 横田 直彦

    ● エンジニア歴9年

    ● 株式会社カケハシでTLをしています 

    ○ 薬局業界でのシステム開発 

    ● 普段使いの言語がPythonです 

    ○ 仕事: バックエンド・ETL処理・業務スクリプトなど 

    ○ プライベート: Pythonista3(iPadアプリ)・LLMで遊ぶ 


    View full-size slide

  3. Copyright © KAKEHASHI Inc. All Rights Reserved.

    3
    テストのメンテナンスの悩み

    ● 関数の修正時にテストを変更する

    ● テストがない関数のテストを作る

    ● 返り値が複雑な関数のテストを作る


    View full-size slide

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


    View full-size slide

  5. Copyright © KAKEHASHI Inc. All Rights Reserved.

    5
    スナップショットテストとは?

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


    View full-size slide

  6. Copyright © KAKEHASHI Inc. All Rights Reserved.

    6
    具体例


    View full-size slide

  7. Copyright © KAKEHASHI Inc. All Rights Reserved.

    7
    コスト
    忠実性
    スナップショットテストをいつ使うか

    ● メリット

    ○ 簡単にテストの作成・更新ができる

    ● デメリット

    ○ 誤ったテストを作りがち

    ○ 日付など実行毎に値が変化する場合に書きづらい

    ● いつ使うのが良い?

    ○ 仕様が頻繁に変わる関数の回帰テスト

    ○ テストがない関数のリファクタリングしたい時

    ○ 関数のレスポンスが複雑な時

    ○ -> 主に統合テストで有効

    ● 具体例

    ○ APIのレスポンスのテスト

    ■ レスポンスのjson

    ○ ETL処理の集計関数のテスト

    ■ 行列データのcsv

    単体
    統合
    E2E
    テストケース数
    テストピラミッド
    実行速度
    決定性
    統合テストの
    工数削減
    に使える

    View full-size slide

  8. Copyright © KAKEHASHI Inc. All Rights Reserved.

    8
    Pythonのライブラリを紹介

    ● snapshottest

    ● syrupy

    ● pytest-snapshot (今回紹介)

    ● inline-snapshot (今回紹介)


    View full-size slide

  9. Copyright © KAKEHASHI Inc. All Rights Reserved.

    9
    pytest-snapshot

    ● スナップショットをファイルに保存し、それとの比較でテスト 

    ● おすすめポイント

    ○ pytestのプラグインがある。snapshotというfixtureが提供される 

    ● スナップショットの更新 

    ○ pytest --snapshot-update 


    View full-size slide

  10. Copyright © KAKEHASHI Inc. All Rights Reserved.

    10
    inline-snapshot

    ● スナップショットをテストコード上に保存 し、それとの比較でテスト 

    ● おすすめポイント

    ○ pytestのプラグインがある。parametrizedテストでも使える 

    ● スナップショットの更新 

    pytest --inline-snapshot=create

    で自動的にテストコードが修正される

    View full-size slide

  11. Copyright © KAKEHASHI Inc. All Rights Reserved.

    11
    スナップショットテストの保存場所による使い分け

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

    View full-size slide

  12. Copyright © KAKEHASHI Inc. All Rights Reserved.

    12
    スナップショットテストで

    簡単に

    システムの品質を改善しよう!


    View full-size slide

  13. Copyright © KAKEHASHI Inc. All Rights Reserved.

    13
    開発メンバーを募集しています!

    Copyright © KAKEHASHI Inc. All Rights Reserved.

    13
    ● バックエンドエンジニア

    ○ 新規事業

    ○ PocketMusubi

    ● データエンジニア


    絶賛募集中!


    View full-size slide

  14. Copyright © KAKEHASHI Inc. All Rights Reserved.

    14
    Appendix: スナップショットテストのTips

    ● 動的に変わる値に対処する 

    ○ パッチで日付の生成関数の返り値を固定する 

    ○ 乱数のシードを固定する 

    ○ スナップショット直前に部分的に削除する 

    ● 失敗時の調査のし易さを改善する 

    ○ ローカルでは失敗させず、とりあえず更新してからdiffを見る 

    ● 具体例

    ○ ETL処理のテスト

    ■ PySparkの処理結果をCSVに変換しスナップショット化 

    ■ 分散処理なので毎回行順が変わるので、ソートしてからcsv化 

    ■ テストコードと結果の一覧性を重視し、インラインに保存 

    ■ 不要な行・列はテスト前に削除 

    ■ 結果の行数が増えないようにテストのケースを分割 


    View full-size slide