PyCon JP 2025

pytest を爆速にする10の方法
2025/09/27 , ラン

UnitTestを書いていますか?UnitTestの実行にはどのくらい時間がかかっていますか?
テスト対象の規模に比例してテスト数は増えていきますが、気付くとテスト実行に1分、2分かかっていた、ということがよくあります。
また、十分に速いと思っていても、10倍の速さでテストが終われば使い方が変わります。
PyPIの事例ではテストの改善によって 163 秒かかっていたのが 30 秒、80%削減しました。
私の事例では、171秒 が 30秒 に、82%削減しました。

テストが爆速になると、色々なメリットがあります。
分かりやすいところでは、手元で実行するのに「待たなくて良い」ので、気軽に再実行できます。
また、CIの実行待ち行列が解消し、サービス利用料の削減にも繋がります。

このトークでは、現実のWebサービス開発のコードを対象に、UnitTest実行時間を削減した10の方法を紹介します。


10の方法

  1. pytest-xdist を使って、並列実行する
  2. DBにはsqlite3のメモリDBをできるだけ使う
  3. DBトランザクションテストをやめる
  4. DBのレコードを作らない
  5. テスト用のデータ量を絞る
  6. 外部通信しない
  7. coverage では sysmon を使う
  8. テスト起動時の不要なインポートを止める
  9. pytestの探索パスをしぼる
  10. pytest-profiling でテスト実行のボトルネックを探る

トークでは、「何をテストするべきか」という観点で、ボトルネックとなっている箇所を置き換えるための判断を行っていくことについても紹介します。「テストでは本番の動作をできるだけ再現させる」と考えてしまうと、本番と同じRDBMS、同じ量のデータ、同じ設定、同じ通信、、などがボトルネックとなり時間が累積していきます。それらを別の方法に置き換えるには、本番とは異なる方法に置き換えるための判断が必要になります。トーク参加者はそういった判断をしてもよいことに気づき、持ち帰ることが出来ます。
また、テスト高速化のために、テストの質を落とさないことも重要です。紹介する10の方法では、元々やっていた品質の担保レベルを落とさずに高速化をおこなってします。そして、テストが爆速になれば、むしろこれまでカバーできていなかった部分までテストできるようになります。


この題材を選んだ理由やきっかけ:

blog https://blog.trailofbits.com/2025/05/01/making-pypis-test-suite-81-faster/ を読み、自分でもプロジェクトに適用したことで多くのメリットがあったため。また、blogからは分からなかった難しさ、技術的な詳細、そして他にも高速化の手法があることを紹介したいため。

オーディエンスが持って帰れる具体的な知識やノウハウ:
  • すぐに適用できるpytestを高速化する10の手法
  • 何をテストするべきか、というUnitTestに対する本質的な問いと判断
  • 高速化することで得られる具体的なメリット
オーディエンスに求める前提知識:
  • UnitTestを書いていること
オーディエンスの経験レベル:

Intermediate

発表の言語:

日本語

発表資料の言語:

日本語

株式会社ビープラウド所属、一般社団法人PyCon JP Association会計理事。
2003年からPythonを使い始めた。業務ではソフトウェアエンジニアとして自社サービスの開発に携わり、上から下まで幅広く担当。個人ではPython mini Hack-a-thonやSphinx-users.jpなどPython関連イベント運営のかたわら、カンファレンスや書籍、OSS開発を通じて技術情報を発信している。著書/訳書:『エキスパートPythonプログラミング 改訂4版(2023 アスキードワンゴ)』『独学コンピューターサイエンティスト(2022年 日経BP社)』『Sphinxをはじめよう第3版(2022 オライリー・ジャパン)』『自走プログラマー(2020年 技術評論社刊)』『独学プログラマー(2018 日経BP社刊)』