学習とサービス・アプリ開発の記録

プライベートで行っている学習やサービス・アプリ開発の記録です。

Pythonにおいては、デプロイ用パッケージの最適化は不要なの?

 

経緯

PythonでPytest導入の記事を幾つか読んでいたところ、テスト用に仮想環境を作成しましょう、といった説明が見当たらなかった。
この作業は必須と思っていた私にとっては、かなり意外な結果だった。

ひょっとして、Pythonではメイン用/開発テスト用で個別に環境を用意すること。それにより、デプロイ用のパッケージ内にテスト用ライブラリの混入を防ぐように取り組むことは一般的ではないのかもしれない。

そうした取り組みを不要なのか?について考えを整理するため、ChatGPTに向けて壁打ちを行った結果を備忘録としてここに記録する。

ChatGPTとの壁打ちの結果

 

User
あなた
■私の認識
Javaやnode.jsなどではtest用、メイン用で必要ライブラリの設定を分けるのが一般的だと私は認識している。 例えば、node.jsではpackage.jsonというファイルで依存ライブラリの設定を管理するが、このファイルの中にはメイン用のdependenciesと開発(テスト)用のdevDependenciesの項目が分かれており、必要ライブラリの定義とデプロイパッケージの作成をメイン用/開発テスト用で個別に実施することが可能になっている。 JavaのWebフレームワークなどでも、mainとtestで別個のフォルダを作成し、ライブラリ定義、デプロイパッケージ作成を個別に記述するのが一般的であったと記憶している。 このような「メイン/テストで個別に設定の用意すること」により、テストに使用する単体テストのライブラリやモックライブラリがメイン用のパッケージに混入することが避けられると認識している。

Pythonにおけるメイン/テストの環境設定
一般的にPythonにおいてはどうだろうか? メインとテストで個別にフォルダを用意する。個別にrequirements.txtを用意する。開発テスト用のライブラリが混入しないようにデプロイ用パッケージを作成する。 そうした取り組みは一般的に広く行われているのだろうか? 具体的には下記のような取り組みは行われているのか?か? ・取り組み1.メイン用と開発・単体テスト用とをフォルダ分けする ・取り組み2.メイン用と開発・テスト用とで個別の仮想環境を用意する ・取り組み3.デプロイ用パッケージの作成はメイン用の仮想環境から実施し、テスト用ライブラリが混入しないようにする googleで簡単にヒットするような初心者向け記事(昨今においては、それは子供だましの質の低い記事を意味することが多い)においては、こうした取り組みは行われていないように見えているので、判断に迷っている。

■質問
質問1.前述の「私の認識」に誤りはないだろうか?
質問2.Pythonにおけるメイン/テストの環境設定に書いたような取り組み1〜3.はPythonにおいては広く行われているのだろうか?取り組み1.〜3.の各々について教えてほしい
質問3.Pythonにおけるメイン/テストの環境設定に書いたような取り組み1〜3.はやるべきだろうか?取り組み1.〜3.のそれぞれに対して、実施した方が良いという根拠、実施する必要はないという根拠を列挙して欲しい
 
ChatGPT
ChatGPT

質問に関して、それぞれ回答します。

質問1: 「私の認識」について

  • 回答: はい、あなたの認識は正しいです。多くのプログラミング言語フレームワークでは、本番(メイン)環境と開発(テスト)環境の依存関係を分けることが一般的です。これは、本番環境に不要な開発用の依存関係を混入させないために重要です。

質問2: Pythonにおけるメイン/テストの環境設定

  1. 取り組み1: メイン用と開発・単体テスト用とをフォルダ分けする

    • 広く行われているか: はい、多くのPythonプロジェクトでは、ソースコードとテストコードを別々のディレクトリに配置することが一般的です(例えば、srctests)。
  2. 取り組み2: メイン用と開発・テスト用とで個別の仮想環境を用意する

    • 広く行われているか: はい、しかしプロジェクトやチームによって異なる場合があります。個別の仮想環境を用意することは、環境間の依存関係を明確に分離し、衝突を防ぐのに有効です。
  3. 取り組み3: デプロイ用パッケージの作成はメイン用の仮想環境から実施する

    • 広く行われているか: はい、本番環境用のパッケージを作成する際には、開発やテスト用の依存関係が含まれないようにすることが重要です。

質問3: 取り組みの必要性について

  1. 取り組み1: フォルダ分け

    • 実施すべき根拠: ソースコードとテストコードの明確な分離により、プロジェクトの構造が明確になり、保守性が向上します。
    • 実施不要の根拠: 小規模プロジェクトの場合、フォルダ分けによる複雑性の増加が逆に管理を難しくする可能性があります。
  2. 取り組み2: 個別の仮想環境

    • 実施すべき根拠: 環境間での依存関係の衝突を避け、開発と本番の環境を明確に分離できます。また、環境ごとの問題の特定が容易になります。
    • 実施不要の根拠: 仮想環境の管理は追加の作業となり、プロジェクトの複雑性を高める可能性があります。
  3. 取り組み3: デプロイ用パッケージの作成

    • 実施すべき根拠: 本番環境に不要な開発・テスト用の依存関係を含めないことで、パッケージのサイズを最適化し、セキュリティリスクを低減します。
    • 実施不要の根拠: 環境ごとのパッケージ作成は追加の手間となり、小規模なプロジェクトや簡単なスクリプトでは過剰な設定となる可能性があります。

これらの取り組みは、プロジェクトの規模や複雑さ、チームの作業フローによって異なります。大規模なプロジェクトや厳密な環境分離が求められる場合には、これらの取り組みが推奨されますが、小規模プロジェクトでは柔軟なアプローチが適している場合もあります。