15

私は最初のPython配布パッケージを開発しています。Pythonパッケージングに関する私の学習曲線は少し横ばいになっているようですが、まだいくつかの未解決の質問に取り組んでいます。1つは、コードと一緒に単体テストをインストールする必要があるかどうかです。

ソースディストリビューションにテストを含めることが重要であることを理解しています。私が疑問に思っているのは、実際にそれらをインストールするように構成する必要があるかどうかです。

意図的にこれを行っているように見える人気のあるパッケージ(PyHamcrest)と、偶然に行っているように見えるパッケージ(behave)を少なくとも1つました。

だから私の(マルチパート)質問はこれです:

  • パッケージコードと一緒にパッケージユニットテストをインストールすることは意味がありますか?

  • もしそうなら、ユースケースは何ですか?誰が何のためにそれらを使用しますか?つまり、ソースディストリビューションをダウンロードしてpython setup.py test代わりに実行するのに完全に満足できないものを誰が使用するでしょうか。

  • そして、彼らはインストールされた単体テストをどのように使用しますか?のようなimport test; test.run()ものかそのようなもの?

4

3 に答える 3

13

私の意見では、正しい答えは NO ですが、テストをインストールするディストリビューションはかなり多くあります。テストはインストールするべきではありませんが、ソース配布に含める必要があります。私の意見では、理想的な世界では、インストールされたパッケージのテストはパッケージ マネージャー (pip) によって実行されるべきであり、site-packagesディレクトリはテスト ソースで汚染されるべきではありません。

私は最近このトピックを調査し、さまざまなソースから情報を収集し、ライブラリ ソースとテストの両方を含むディストリビューションのディレクトリ/パッケージ階層を構造化するいくつかの異なる方法を見つけました。これらの構造のほとんどは時代遅れのようで、当時の古いディストリビューション システムの不完全な機能セットを回避する試みとして考案されました。残念なことに、多くのオンライン ソース (古いブログ投稿/ドキュメント) がまだ古い方法を宣伝しているため、オンライン検索で古いディストリビューションのハウツー/チュートリアルを簡単に見つけることができます。

「my_lib」というライブラリがあり、ディストリビューションのソースを構造化したいとします。ディストリビューションを構築するための 2 つの一般的で一見時代遅れに見える方法と、最も用途が広いとわかった 3 つ目の方法を紹介します。3番目の方法も時代遅れかもしれませんが、この回答を投稿した時点で私が知っている最良の方法です。;-)

方法 1

(意図的にまたは意図せずに) テストをインストールするディストリビューションは、通常、この方法を使用します。

階層

+- my_lib
|  +- __init__.py
|  +- source1.py
|  +- source2.py
|  +- tests
|     +- __init__.py
|     +- test_1.py
|     +- test_2.py
+- setup.py

方法 2

テストはインストールされませんが、ファイルを通じてソース配布に含める必要がありMANIFEST.inます。

階層

+- my_lib
|  +- __init__.py
|  +- source1.py
|  +- source2.py
+- tests
|  +- __init__.py
|  +- test_1.py
|  +- test_2.py
+- setup.py

方法#3(私はこれが好きです。)

これは、方法 2 に少しひねりを加えたもの (ディレクトリ) とほとんど同じsrcです。

階層

+- src
|  +- my_lib
|     +- __init__.py
|     +- source1.py
|     +- source2.py
+- tests
|  +- __init__.py
|  +- test_1.py
|  +- test_2.py
+- setup.py

setup.py での setup() 呼び出し

from setuptools import setup, find_packages

setup(
    ...
    packages=find_packages('src'),
    package_dir={'': 'src'},
    ...
)

MANIFEST.in

recursive-include tests *.py

テストはインストールされませんが、.NET を通じてソース配布に含まれますMANIFEST.in

方法 3 の場合、src通常、lib のルートである単一のパッケージのみを含むディレクトリがあります。パッケージmy_libsrcディレクトリ (ディレクトリではなくパッケージなので、必要ありませんsrc/__init__.py) に配置すると、次の利点があります。

  • setup.pyを含むディレクトリを実行するsetup.pyと、Python パスに暗黙的に追加されます。これは、setup.pyパッケージがsetup.py. my_libパッケージを入れることで、srcこの問題を回避できます。
  • 分散テスト ソースを使用して、分散ライブラリ ソースとインストール済みライブラリの両方を簡単にテストできます。

    • setup.py test呼び出しのpackage_dir={'': 'src'}一部を使用してテストを実行すると、テストで.xml に保持しているライブラリ パッケージsetup()が表示されることが保証されます。my_libsrc/my_lib
    • なしでテストを実行することもできますsetup.py。最も単純なケースでは、コマンドでそれを行うことができますpython -m unittest。この場合、srcdir は python パスの一部ではないため、この方法を使用して、 のソースではなく、インストールされているライブラリのバージョンをテストできますsrc
于 2016-04-13T14:29:43.580 に答える
11

この問題を調査した後、より経験豊富な人が反対の意見を述べるまで、私の理解では、単純な答えは次のとおりです。

テストがインストールされた場所で私が見つけた少数のケースでは、すべてが偶然であることが判明し、気付かずに間違いを犯すのは思ったより簡単です。

それがどのように起こるかは次のとおりです。

  1. このpackages=find_packages()パラメーターは setup.py で使用されるため、パッケージを明示的にリストしなくても見つけることができます。
  2. testフォルダーは ( を追加することによって) パッケージ化されるため__init__.py、テストは相対命名 ( など) を使用してテストするモジュールを参照できますfrom .. import pkg.mod
  3. setuptoolstestプロジェクト内の他のパッケージと一緒に、個別のパッケージとしてインストールされます。これはimport test、Python インタープリターで実行できることを意味し、特に他の多くの人々がテストディレクトリにその名前を使用しているため、ほとんどの場合、意図したとおりに動作しないことに注意してください:)

修正は、設定を使用することです:packages=find_packages(exclude=['test'])テストディレクトリがインストールされないようにします。

于 2013-01-31T01:44:26.430 に答える
2

ただし、私は専門家ではありません。私の意見を共有したいと思います。

外部の理由によって何かが失敗する可能性があると予想される場合は、常にコードの横にテストを配置します。ビット順、奇妙なタイム ゾーン、文字コード、24 ビット整数など、遭遇してテストできる奇妙なものなら何でも構いません。

ソースをダウンロードしてテストを実行したくない人はいますか? パッケージがソースから削除されている一部のdebianユーザー (Python について話していることは知っていますが、少し一般的にさせてください) と、システム内の奇妙なことが原因でライブラリが失敗することがあります。

テストが内部の健全性のみを保証する場合は、ライブラリの内部を変更することはないため、ソースがないとあまり価値がないため、添付をスキップします。

個人的には、ビット順序が異なる IBM マシンに移動したために失敗したという話を聞いたことがあります。それがビット操作に依存していたのか、事前に計算されて静的にキャッシュされていたのかは覚えていません。ただし、保存したと思われるものをロードするかどうかを確認することが賢明な場合もあります。

編集:言い換えたほうがいいかもしれません。移植性に関する警告があると思われる場合は、テストをインストールします。別のシステムにデプロイするときは常にチェックするのが良いと思います。

于 2013-01-22T09:14:40.383 に答える