ライブラリやアプリを作成している場合、単体テスト ファイルはどこに保存されますか?
テスト ファイルをメインのアプリ コードから分離するのは良いことですが、テストするモジュールをインポートするのが難しくなるため、アプリのルート ディレクトリ内の "tests" サブディレクトリにそれらを配置するのは面倒です。
ここにベストプラクティスはありますか?
ライブラリやアプリを作成している場合、単体テスト ファイルはどこに保存されますか?
テスト ファイルをメインのアプリ コードから分離するのは良いことですが、テストするモジュールをインポートするのが難しくなるため、アプリのルート ディレクトリ内の "tests" サブディレクトリにそれらを配置するのは面倒です。
ここにベストプラクティスはありますか?
ファイルmodule.py
の場合、単体テストは通常test_module.py
、Pythonic の命名規則に従って呼び出される必要があります。
一般的に認められている配置場所がいくつかありますtest_module.py
。
module.py
ます。../tests/test_module.py
コード ディレクトリと同じレベル)。tests/test_module.py
code ディレクトリの 1 レベル下) 内。テストを見つけてインポートするのが簡単なため、#1 を好みます。使用しているビルド システムが何であれ、 で始まるファイルを実行するように簡単に構成できますtest_
。実際、テスト検出に使用されるデフォルトunittest
test*.py
のパターンは です。
テスト ファイルが 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
pytest
テスト レイアウトのグッド プラクティスunittest
一般的な方法は、テスト ディレクトリをモジュール/パッケージと同じ親ディレクトリに配置することです。したがって、モジュールの名前が foo.py の場合、ディレクトリ レイアウトは次のようになります。
parent_dir/
foo.py
tests/
もちろん、やり方は一つではありません。また、 tests サブディレクトリを作成し、絶対インポートを使用してモジュールをインポートすることもできます。
テストをどこに置いても、noseを使用して実行することをお勧めします。Noseはディレクトリを検索してテストを行います。このようにして、組織的に最も意味のある場所にテストを配置できます。
Pythonプログラムの単体テストを生成するPythoscope(https://pypi.org/project/pythoscope/ )を作成するときに、まったく同じ質問がありました。ディレクトリを選択する前に、Pythonリストでのテストについて人々をポーリングしましたが、さまざまな意見がありました。最終的に、ソースコードと同じディレクトリに「tests」ディレクトリを配置することにしました。そのディレクトリで、親ディレクトリの各モジュールのテストファイルを生成します。
上記の Jeremy Cantrell が指摘しているように、私は単体テストをファイル自体に入れる傾向もありますが、テスト関数を本体に入れるのではなく、すべてをファイルに入れる傾向があります。
if __name__ == '__main__':
do tests...
ブロック。これにより、テストしているpythonファイルの使用方法に関する「サンプルコード」としてドキュメントがファイルに追加されます。
付け加えておきますが、私は非常にタイトなモジュール/クラスを書く傾向があります。モジュールに非常に多くのテストが必要な場合は、それらを別のモジュールに入れることができますが、その場合でも、次のように追加します。
if __name__ == '__main__':
import tests.thisModule
tests.thisModule.runtests
これにより、ソース コードを読んでいる人は誰でも、テスト コードを探す場所を知ることができます。
ディレクトリを使用してtests/
から、相対インポートを使用して主要なアプリケーション モジュールをインポートします。したがって、MyApp/tests/foo.py には次のようなものがあります。
from .. import foo
モジュールをインポートしMyApp.foo
ます。
確立された「ベストプラクティス」があるとは思いません。
アプリ コードの外にある別のディレクトリにテストを配置しました。次に、すべてのテストを実行する前に、メインのアプリ ディレクトリをテスト ランナー スクリプト (他の処理も行う) の sys.path (どこからでもモジュールをインポートできるようにする) に追加します。このようにして、リリース時にテスト ディレクトリをメイン コードから削除する必要がなくなり、時間と労力を節約できます。
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 を使用してパッケージ化すると、メイン ライブラリ モジュール (のみ) をパッケージ化できます。これは、特にアジャイル環境での保守性に役立ちます。
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 を確認してください
どうやって...
フォルダ構造:
project/
src/
code.py
tests/
setup.py
Setup.pyは、プロジェクトモジュールを含む場所としてsrc /を指し、次のコマンドを実行します。
setup.py develop
これにより、プロジェクトがサイトパッケージに追加され、作業コピーが示されます。私のテストを実行するには、次を使用します。
setup.py tests
構成したテストランナーを使用します。
私はトップレベルのテストディレクトリを好みます。これは、輸入が少し難しくなることを意味します。そのために、私には2つの解決策があります:
test_suite='tests.runalltests.suite'
てsetup()
、簡単にテストを実行できます。python setup.py test
PYTHONPATH=. python tests/runalltests.py
これが M2Crypto のコードでどのようにサポートされているかを示します。
ノーズテストでテストを実行したい場合は、少し違うことをする必要があるかもしれません。
テスト対象のコード (CUT) と同じディレクトリにテストを配置しました。プラグインで pytest を微調整できるプロジェクトでは、特定のモジュールとそのテストを一緒に編集するのが非常に簡単になるテストfoo.py
に使用します。foo.pt
vi foo.*
これができない場合は、foo_ut.py
または同様のものを使用します。vi foo*
それもキャッチされますがfoobar.py
、foobar_ut.py
それらが存在する場合は引き続き使用できます。
どちらの場合も、テスト検出プロセスを微調整してこれらを見つけます。
これにより、ディレクトリ リストのコードのすぐ横にテストが配置され、そこにテストがあることが明確になり、別のファイルにある場合と同じくらい簡単にテストを開くことができます。(前述のように、コマンド ラインから起動したエディタの場合、GUI システムの場合は、コード ファイルと隣接する (またはほぼ隣接する) テスト ファイルをクリックします。
他の人が指摘しているように、これにより、リファクタリングが容易になり、必要に応じて他の場所で使用するためにコードを抽出することも容易になります。
テストをまったく別のディレクトリ ツリーに配置するという考えは、私は本当に嫌いです。開発者が CUT でファイルを開くときに、テストを開くのを必要以上に難しくするのはなぜですか? 大多数の開発者が、テストの作成や微調整に熱心であり、そのための障害を言い訳にせずに無視するわけではありません。(私の経験ではまったく逆です。テストをできるだけ簡単に書いたとしても、わざわざテストを書けない開発者をたくさん知っています。)
を使用しております
app/src/code.py
app/testing/code_test.py
app/docs/..
各テストファイルで、に挿入../src/
しsys.path
ます。これは最も優れたソリューションではありませんが、機能します。誰かがJavaのMavenのようなものを思いついたら、どんなプロジェクトに取り組んでいても、うまく機能する標準的な規則を提供してくれるといいと思います。
テストが単純な場合は、単にそれらをdocstringに入れます-Pythonのほとんどのテストフレームワークはそれを使用できます:
>>> import module
>>> module.method('test')
'testresult'
他のより複雑なテストについては、私はそれらを../tests/test_module.py
またはに入れますtests/test_module.py
。
C# では、通常、テストを別のアセンブリに分離しました。
Python では、これまでのところ、テストが関数の docstring にある doctest を作成するかif __name__ == "__main__"
、モジュールの下部にあるブロックに配置する傾向がありました。
「foo」というパッケージを作成するときは、単体テストを別のパッケージ「foo_test」に入れます。モジュールとサブパッケージは、SUTパッケージモジュールと同じ名前になります。たとえば、モジュールfoo.xyのテストはfoo_test.xyにあります。各テストパッケージの__init __。pyファイルには、パッケージのすべてのテストスイートを含むAllTestsスイートが含まれています。setuptoolsは、メインのテストパッケージを指定する便利な方法を提供するため、「pythonsetup.pydevelop」の後に「pythonsetup.pytest」または「pythonsetup.pytest-sfoo_test.x.SomeTestSuite」を使用できます。ただ特定のスイート。
私は最近 Python でプログラミングを始めたので、まだベスト プラクティスを見つける機会がありませんでした。しかし、すべてのテストを見つけて実行するモジュールを作成しました。
ので、私は持っています:
アプリ/ appfile.py テスト/ appfileTest.py
より大きなプロジェクトに進むにつれて、それがどのようになるかを確認する必要があります.