Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Python. Project Structure (II)

2025年10月04日に「Dev.to」が公開したITニュース「Python. Project Structure (II)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Pythonプロジェクトで、実行用と開発・テスト用のライブラリを`requirements.txt`と`requirements-dev.txt`で分けて管理し、`pytest`を使った効率的なテスト環境を構築する手順を解説。`.env`ファイルで設定値を管理する方法も紹介し、テスト駆動開発の基本を実践的に学べる。

出典: Python. Project Structure (II) | Dev.to公開日:

ITニュース解説

Pythonでアプリケーション開発を始める際、ただコードを書くだけでなく、その土台となるプロジェクトの構造をしっかり作り、テストを用意することがとても重要だ。これは、将来的にアプリケーションを大きくしていくため、そして安心して修正を加えられるようにするための基礎となる。

まず、アプリケーションが動くために必要な外部の部品、つまりライブラリを管理するところから始める。requirements.txtというファイルを作り、アプリケーションの「設定」を扱うためのライブラリを記述していく。ここではpydantic-settingspydantictyping-extensionspython-dotenvといったものが挙げられている。これらは、アプリケーションの設定情報をスマートに管理したり、.envというファイルから環境変数を読み込んだりするために使われる。

次に、アプリケーションが正しく動くかを自動的に確認するための「テスト」の準備だ。テスト用のライブラリは、実際のアプリケーションがユーザーに提供されるときには不要なため、開発時だけ使うものとして別のファイルに分けて管理するのが一般的だ。そこでrequirements-dev.txtというファイルを作成し、pytestというテストフレームワークとその関連ライブラリ(pytest-mockpytest-asynciopytest-covなど)や、コードの品質を保つためのツール(flake8blackisortmypyなど)を記述する。これらのファイルが準備できたら、pip install -r requirements.txt -r requirements-dev.txtというコマンド一つで、アプリケーションに必要なものと開発に必要なもの、両方のライブラリを一括でインストールできる。

これらの準備が整ったら、いよいよプロジェクトの骨格を作っていく。このニュース記事では「la_fragua」という名前のプロジェクトを例に挙げている。基本的な構造としては、アプリケーションの本体コードを置くappディレクトリと、テストコードを置くtestsディレクトリ、そしてそれらをまとめる最上位の階層がある。Pythonでは、各ディレクトリを「モジュール」や「パッケージ」として認識させるために、その中に__init__.pyという空のファイルを配置するのがルールだ。これにより、Pythonが各ディレクトリをコードのまとまりとして扱えるようになる。

プロジェクト構造ができたところで、テストの具体的な設定に進む。テストフレームワークであるpytestをプロジェクトに最適化するために、プロジェクトのルートディレクトリにpytest.iniファイルを作成する。このファイルには、テストコードがどこにあるか、どのファイル名やクラス名、関数名がテストとして認識されるか、そしてテスト実行時の表示形式など、pytestの動作に関する詳細な設定を記述する。例えば、testpaths = testsは、testsディレクトリにあるファイルがテスト対象であることを示し、python_files = test_*.pytest_で始まるPythonファイルがテストコードだと認識されるように設定している。

また、テスト全体で共通して使いたい処理や、テストの準備段階で必要な「フィクスチャ」と呼ばれるものを管理するために、testsディレクトリの直下にconftest.pyというファイルを作成する。ここでは、例えばテスト実行中に特定の環境変数を設定するような処理を記述できる。

最初のテストを書いてみよう。tests/test_settings.pyというファイルを作成し、test_settings_loaded_correctlyという関数で、アプリケーションの設定が正しく読み込まれるかを検証する。この時点では、まだ設定を読み込むアプリケーションコードは実装していないため、pytestコマンドでテストを実行すると、当然ながらテストは失敗する(「赤」の状態)。

ここが「テスト駆動開発」という開発手法の重要なポイントだ。まずテストを失敗させて、その失敗するテストをパスさせるために必要な最小限のアプリケーションコードを実装する。こうすることで、何が必要で、何が不要かを明確にしながら開発を進めることができる。

次に、アプリケーションの設定を定義するコードを作成する。app/settings/settings.pyファイルにSettingsというクラスを定義し、アプリケーションの名前やラベルといった設定項目に初期値を与える。このSettingsクラスのインスタンスをsettingsという名前で利用できるようにする。

このコードを実装した後、再度pytestコマンドを実行すると、今度はテストが成功するはずだ(「緑」の状態)。これは、最初のアサート(検証)がデフォルト値('(sin datos)')に対して行われていたためだ。

しかし、アプリケーションは常に進化する。設定も.envファイルのような外部ファイルから読み込むように改善したい場合がある。これに対応するため、まずテストの方を先に更新する。test_settings_loaded_correctly関数のアサート部分を、将来的に.envファイルから読み込まれるであろう具体的な値(例: app_name == 'la_fragua')に変更する。この状態でテストを再実行すると、当然、またテストは失敗する。

テストが失敗したことを確認したら、.envファイルを作成し、実際にAPP_NAME="la_fragua"のような環境変数を定義する。

そして、app/settings/settings.pyファイルに戻り、設定を.envファイルから読み込むようにSettingsクラスを改善する。ここでpydantic-settingsライブラリの真価が発揮される。BaseSettingsクラスを継承し、model_configという設定を追加して、env_file.envファイルのパスを指定する。これにより、Settingsクラスは自動的に.envファイルから対応する環境変数を読み込み、設定値として利用できるようになる。また、アプリケーションが様々な環境(Linux、Windowsなど)で正しく動作するように、.envファイルのパスを動的に解決するためのコードも追加する。

これらの修正が完了した後に再度pytestコマンドを実行すると、今度はテストが成功するはずだ。これで、アプリケーションの設定が外部ファイルから正しく読み込まれるようになり、その変更がテストによって保証されたことになる。

Pythonのプロジェクトでは、繰り返しになるが、各ディレクトリをモジュールとして機能させるために__init__.pyファイルが必要だということを常に覚えておく必要がある。また、テストコードを書く際の一般的なパターンとして「Arrange(準備)、Act(実行)、Assert(検証)」という原則がある。これは、テストの対象となるデータや状態を準備し、テストしたい操作を実行し、その結果が期待通りであるかを検証するという流れを指す。この原則に従うことで、テストコードはより分かりやすく、保守しやすくなる。pytestはこの原則に沿ったテストをシンプルに書くのに非常に適しているため、多くのプロジェクトで採用されている。このように、段階的にプロジェクトを構築し、テストを伴いながら開発を進めることが、堅牢でメンテナンスしやすいアプリケーションを作るための鍵となる。

関連コンテンツ

関連IT用語

関連ITニュース