PyCon JP 2024

pytest プラグインを開発して DRY に自動テストを書こう
2024-09-28 , 4F Track3

業務で pytest を使って自動テストを書いていて「あれ、conftest.py で書いているこの処理、他の tests ディレクリの conftest.py でも書いた気がするな...」と感じたことはないでしょうか?
自動テストを実装する上では、例えばデータベースにテーブルを作る、データベースに接続するセッションを用意するなど、テスト実行のために必要な前処理が色々と発生します。こういった処理は conftest.py に書くことが多いですが、サービスやプロダクトが増えて tests ディレクトリが分散してくると、色々な tests ディレクトリ内で同じような conftest.py が書かれて DRY 原則に反した状態になり、テストコードの保守性の低下を招く要因になります。

pytest を使っていると何かしらのサードパーティのプラグインを使うことが多いと思いますが、上記の課題はプラグインを自作することで解決することができます。

このセッションでは、私が所属する会社のプロダクトの開発において抱えていた課題と、その課題を解決するために実際に開発した社内向けの pytest プラグインの実装を紹介します。自作の pytest プラグインを開発してより快適にテストを実装できるようになりましょう!


このセッションでは以下のような内容について話すことを予定しています。

pytest のプラグインを作ろうと思った背景

私が所属している会社のプロダクト開発において実際に開発者から上がっていた声を紹介しつつ、どのようなペインがあったかを説明します。

プラグインで提供している機能

上記の課題を解決するために pytest プラグインで提供している機能を紹介します。
- Docker で MySQL のコンテナを起動する
- 起動した MySQL コンテナのヘルスチェックが通るまで待機する
- 上で起動した MySQL コンテナの DB セッションを提供する
- 上で起動した MySQL コンテナの DB にテーブルを作成する
- factory のセッションを提供する
- テストメソッドごとにデータベースのトランザクションをロールバックする

プラグインのディレクトリ設計

具体的なディレクトリ設計や、プラグインをインストールして使えるようにするための仕組みを説明します。

自動テスト並列実行のための工夫

プラグインを使って自動テストを実行する際に、テスト実行を高速化することを目的に並列実行ができるようにしました。ただし、データベースへの読み書きを伴うテストがある場合、並列実行のプロセスごとに独立のデータベースを使わなければ、別プロセスが書き込んだデータによりテスト結果が変わってしまい実用に耐えません。
データベースへの読み書きを伴うテストがある場合でもテストを並列実行できるようにするための実装上のポイントを紹介します。

プラグインが正常動作することを保証する

プラグインが期待した動作をすることを保証するために、プラグインの自動テストを書く方法を紹介します。

プラグインを導入する

実装した pytest プラグインを使って自動テストを実装する方法を紹介します。


Why did you choose this topic?:

私が所属する会社では Python の Lambda や ECS のソースコードがモノレポで管理されています。Lambda や ECS ごとにテストを書いていて、同じようなことをしている conftest.py や factory を置いているが、それぞれで書き方が微妙に違って認知負荷が高くなっていることや無駄が増えていることが課題となっていました。そこでこのセッションで紹介する社内向けの pytest プラグインを実装して、上記の課題を解決しました。

開発規模が大きくなると同じような課題は発生しがちであると思われ、このような課題を抱える方々に課題解決のプロセスを広く共有したいと考えてこの題材を選択しました。

Knowledges and know-how the audience can get from your talk:
  • pytest のプラグインを使ってどんなことができるか
  • pytest のプラグインを実装する方法
  • pytest のプラグインが期待する動作をすることを保証するためのテストの書き方
  • データベースへの読み書きを伴う自動テストを並列実行するための設計、実装方法
Prior knowledges speakers assume the audience to have:
  • pytest を使ったテストコード実装についての知識
  • データベース操作に関する基礎知識
Audience experiment:

Beginner

Language of presentation:

日本語

Language of presentation material:

日本語

See also: pytest プラグインを開発して DRY に自動テストを書こう

シンプルフォーム株式会社 エンジニアリングマネージャ / 公認 AML スペシャリスト (CAMS)

金融犯罪を防ぐためのアプリケーションとそれを作る開発組織を作ることに日々全力を傾けている。Python で始めて仕事として開発したのは日本の法人・商業登記簿の PDF のパーサで、法人・商業登記簿には深い造詣がある。