PyCon JP 2025 Logo
広島国際会議場
JPEN
Takayuki Shimizukawa

Takayuki Shimizukawa

pytest を爆速にする10の方法

ラン日本語
05:05 - 05:3530min
DAY 2
09/27
SAT

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

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

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


トーク詳細 / Description

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の方法では、元々やっていた品質の担保レベルを落とさずに高速化をおこなってします。そして、テストが爆速になれば、むしろこれまでカバーできていなかった部分までテストできるようになります。

Takayuki Shimizukawa

Takayuki Shimizukawa

プロフィール

株式会社ビープラウド所属、一般社団法人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社刊)』