541

ライブラリやアプリを作成している場合、単体テスト ファイルはどこに保存されますか?

テスト ファイルをメインのアプリ コードから分離するのは良いことですが、テストするモジュールをインポートするのが難しくなるため、アプリのルート ディレクトリ内の "tests" サブディレクトリにそれらを配置するのは面倒です。

ここにベストプラクティスはありますか?

4

18 に答える 18

235

ファイルmodule.pyの場合、単体テストは通常test_module.py​​、Pythonic の命名規則に従って呼び出される必要があります。

一般的に認められている配置場所がいくつかありますtest_module.py

  1. と同じディレクトリにありmodule.pyます。
  2. 内 (../tests/test_module.pyコード ディレクトリと同じレベル)。
  3. ( tests/test_module.pycode ディレクトリの 1 レベル下) 内。

テストを見つけてインポートするのが簡単なため、#1 を好みます。使用しているビルド システムが何であれ、 で始まるファイルを実行するように簡単に構成できますtest_。実際、テスト検出に使用されるデフォルトunittesttest*.pyのパターンは です。

于 2008-09-15T12:52:00.500 に答える
92

1 つのテスト ファイルのみ

テスト ファイルが 1 つしかない場合は、最上位ディレクトリに配置することをお勧めします。

module/
    lib/
        __init__.py
        module.py
    test.py

CLI でテストを実行する

python test.py

多くのテストファイル

多くのテスト ファイルがある場合は、次のtestsフォルダーに配置します。

module/
    lib/
        __init__.py
        module.py
    tests/
        test_module.py
        test_module_function.py
# test_module.py

import unittest
from lib import module

class TestModule(unittest.TestCase):
    def test_module(self):
        pass

if __name__ == '__main__':
    unittest.main()

CLI でテストを実行する

# In top-level /module/ folder
python -m tests.test_module
python -m tests.test_module_function

使用するunittest discovery

unittest discoveryパッケージフォルダー内のすべてのテストを検索します。

フォルダー内__init__.pyに作成するtests/

module/
    lib/
        __init__.py
        module.py
    tests/
        __init__.py
        test_module.py
        test_module_function.py

CLI でテストを実行する

# In top-level /module/ folder

# -s, --start-directory (default current directory)
# -p, --pattern (default test*.py)

python -m unittest discover

参照

単体テスト フレームワーク

于 2014-04-30T10:58:51.970 に答える
51

一般的な方法は、テスト ディレクトリをモジュール/パッケージと同じ親ディレクトリに配置することです。したがって、モジュールの名前が foo.py の場合、ディレクトリ レイアウトは次のようになります。

parent_dir/
  foo.py
  tests/

もちろん、やり方は一つではありません。また、 tests サブディレクトリを作成し、絶対インポートを使用してモジュールをインポートすることもできます。

テストをどこに置いても、noseを使用して実行することをお勧めします。Noseはディレクトリを検索してテストを行います。このようにして、組織的に最も意味のある場所にテストを配置できます。

于 2008-09-14T06:46:14.960 に答える
32

Pythonプログラムの単体テストを生成するPythoscope(https://pypi.org/project/pythoscope/ )を作成するときに、まったく同じ質問がありました。ディレクトリを選択する前に、Pythonリストでのテストについて人々をポーリングしましたが、さまざまな意見がありました。最終的に、ソースコードと同じディレクトリに「tests」ディレクトリを配置することにしました。そのディレクトリで、親ディレクトリの各モジュールのテストファイルを生成します。

于 2009-05-02T17:08:05.437 に答える
27

上記の Jeremy Cantrell が指摘しているように、私は単体テストをファイル自体に入れる傾向もありますが、テスト関数を本体に入れるのではなく、すべてをファイルに入れる傾向があります。

if __name__ == '__main__':
   do tests...

ブロック。これにより、テストしているpythonファイルの使用方法に関する「サンプルコード」としてドキュメントがファイルに追加されます。

付け加えておきますが、私は非常にタイトなモジュール/クラスを書く傾向があります。モジュールに非常に多くのテストが必要な場合は、それらを別のモジュールに入れることができますが、その場合でも、次のように追加します。

if __name__ == '__main__':
   import tests.thisModule
   tests.thisModule.runtests

これにより、ソース コードを読んでいる人は誰でも、テスト コードを探す場所を知ることができます。

于 2008-09-19T16:46:53.827 に答える
14

ディレクトリを使用してtests/から、相対インポートを使用して主要なアプリケーション モジュールをインポートします。したがって、MyApp/tests/foo.py には次のようなものがあります。

from .. import foo

モジュールをインポートしMyApp.fooます。

于 2008-09-14T18:18:58.133 に答える
13

確立された「ベストプラクティス」があるとは思いません。

アプリ コードの外にある別のディレクトリにテストを配置しました。次に、すべてのテストを実行する前に、メインのアプリ ディレクトリをテスト ランナー スクリプト (他の処理も行う) の sys.path (どこからでもモジュールをインポートできるようにする) に追加します。このようにして、リリース時にテスト ディレクトリをメイン コードから削除する必要がなくなり、時間と労力を節約できます。

于 2008-09-14T06:46:03.837 に答える
13

Python でテスト フレームワークを開発した経験から、Python 単体テストを別のディレクトリに配置することをお勧めします。対称的なディレクトリ構造を維持します。これは、単体テストをパッケージ化するのではなく、コア ライブラリのみをパッケージ化する場合に役立ちます。以下は、概略図を介して実装されます。

                              <Main Package>
                               /          \
                              /            \
                            lib           tests
                            /                \
             [module1.py, module2.py,  [ut_module1.py, ut_module2.py,
              module3.py  module4.py,   ut_module3.py, ut_module.py]
              __init__.py]

このように、これらのライブラリを rpm を使用してパッケージ化すると、メイン ライブラリ モジュール (のみ) をパッケージ化できます。これは、特にアジャイル環境での保守性に役立ちます。

于 2014-03-28T04:22:38.497 に答える
11

GitHub でいくつかの主要な Python プロジェクトをチェックして、いくつかのアイデアを得ることをお勧めします。

コードが大きくなり、ライブラリを追加する場合は、setup.py と同じディレクトリにテスト フォルダーを作成し、各テスト タイプ (ユニットテスト、統合など) のプロジェクト ディレクトリ構造をミラーリングすることをお勧めします。

たとえば、次のようなディレクトリ構造があるとします。

myPackage/
    myapp/
       moduleA/
          __init__.py
          module_A.py
       moduleB/
          __init__.py
          module_B.py
setup.py

test フォルダーを追加すると、次のようなディレクトリ構造になります。

myPackage/
    myapp/
       moduleA/
          __init__.py
          module_A.py
       moduleB/
          __init__.py
          module_B.py
test/
   unit/
      myapp/
         moduleA/
            module_A_test.py
         moduleB/
            module_B_test.py
   integration/
          myapp/
             moduleA/
                module_A_test.py
             moduleB/
                module_B_test.py
setup.py

適切に作成された Python パッケージの多くは、同じ構造を使用しています。非常に良い例は Boto パッケージです。https://github.com/boto/boto を確認してください

于 2016-05-09T17:54:13.883 に答える
7

どうやって...

フォルダ構造:

project/
    src/
        code.py
    tests/
    setup.py

Setup.pyは、プロジェクトモジュールを含む場所としてsrc /を指し、次のコマンドを実行します。

setup.py develop

これにより、プロジェクトがサイトパッケージに追加され、作業コピーが示されます。私のテストを実行するには、次を使用します。

setup.py tests

構成したテストランナーを使用します。

于 2010-03-02T12:50:51.140 に答える
5

私はトップレベルのテストディレクトリを好みます。これは、輸入が少し難しくなることを意味します。そのために、私には2つの解決策があります:

  1. setuptools を使用します。次に、 に渡しtest_suite='tests.runalltests.suite'setup()、簡単にテストを実行できます。python setup.py test
  2. テストの実行時に PYTHONPATH を設定します。PYTHONPATH=. python tests/runalltests.py

これが M2Crypto のコードでどのようにサポートされているかを示します。

ノーズテストでテストを実行したい場合は、少し違うことをする必要があるかもしれません。

于 2008-12-19T23:48:07.130 に答える
4

テスト対象のコード (CUT) と同じディレクトリにテストを配置しました。プラグインで pytest を微調整できるプロジェクトでは、特定のモジュールとそのテストを一緒に編集するのが非常に簡単になるテストfoo.pyに使用します。foo.ptvi foo.*

これができない場合は、foo_ut.pyまたは同様のものを使用します。vi foo*それもキャッチされますがfoobar.pyfoobar_ut.pyそれらが存在する場合は引き続き使用できます。

どちらの場合も、テスト検出プロセスを微調整してこれらを見つけます。

これにより、ディレクトリ リストのコードのすぐ横にテストが配置され、そこにテストがあることが明確になり、別のファイルにある場合と同じくらい簡単にテストを開くことができます。(前述のように、コマンド ラインから起動したエディタの場合、GUI システムの場合は、コード ファイルと隣接する (またはほぼ隣接する) テスト ファイルをクリックします。

他の人が指摘しているように、これにより、リファクタリングが容易になり、必要に応じて他の場所で使用するためにコードを抽出することも容易になります。

テストをまったく別のディレクトリ ツリーに配置するという考えは、私は本当に嫌いです。開発者が CUT でファイルを開くときに、テストを開くのを必要以上に難しくするのはなぜですか? 大多数の開発者が、テストの作成や微調整に熱心であり、そのための障害を言い訳にせずに無視するわけではありません。(私の経験ではまったく逆です。テストをできるだけ簡単に書いたとしても、わざわざテストを書けない開発者をたくさん知っています。)

于 2018-12-12T10:10:06.843 に答える
3

を使用しております

app/src/code.py
app/testing/code_test.py 
app/docs/..

各テストファイルで、に挿入../src/sys.pathます。これは最も優れたソリューションではありませんが、機能します。誰かがJavaのMavenのようなものを思いついたら、どんなプロジェクトに取り組んでいても、うまく機能する標準的な規則を提供してくれるといいと思います。

于 2008-09-24T17:44:16.050 に答える
1

テストが単純な場合は、単にそれらをdocstringに入れます-Pythonのほとんどのテストフレームワークはそれを使用できます:

>>> import module
>>> module.method('test')
'testresult'

他のより複雑なテストについては、私はそれらを../tests/test_module.pyまたはに入れますtests/test_module.py

于 2008-09-16T21:10:12.917 に答える
1

C# では、通常、テストを別のアセンブリに分離しました。

Python では、これまでのところ、テストが関数の docstring にある doctest を作成するかif __name__ == "__main__"、モジュールの下部にあるブロックに配置する傾向がありました。

于 2008-09-15T03:09:29.200 に答える
0

「foo」というパッケージを作成するときは、単体テストを別のパッケージ「foo_test」に入れます。モジュールとサブパッケージは、SUTパッケージモジュールと同じ名前になります。たとえば、モジュールfoo.xyのテストはfoo_test.xyにあります。各テストパッケージの__init __。pyファイルには、パッケージのすべてのテストスイートを含むAllTestsスイートが含まれています。setuptoolsは、メインのテストパッケージを指定する便利な方法を提供するため、「pythonsetup.pydevelop」の後に「pythonsetup.pytest」または「pythonsetup.pytest-sfoo_test.x.SomeTestSuite」を使用できます。ただ特定のスイート。

于 2008-09-15T14:56:35.630 に答える
-2

私は最近 Python でプログラミングを始めたので、まだベスト プラクティスを見つける機会がありませんでした。しかし、すべてのテストを見つけて実行するモジュールを作成しました。

ので、私は持っています:

アプリ/
 appfile.py
テスト/
 appfileTest.py

より大きなプロジェクトに進むにつれて、それがどのようになるかを確認する必要があります.

于 2008-09-14T18:02:12.340 に答える