5

テストが内部にあるいくつかの小さなモジュールがあり、ファイル名に含まれていないため、それらを検索しませんpy.testnosetest

py.testすべてのpythonファイル内のテストを再帰的に説得または検索するにはどうすればよいですかnose- '''ファイル名にないものも含めてtest'''?

ソース ファイル内では、標準の命名規則を守っています: class testSomeNamewith methods def test_some_name.

これが不可能な場合、同じ結果を得るために他にどのような解決策を使用できますか?

テストを含むすべてのファイルのリストを手動で作成したくありません。検出をサポートするソリューションが必要です。

4

5 に答える 5

5

py.testを使えば簡単です。conftest.pyこのコンテンツを含むファイルを作成します。

# content of conftest.py file at root of your project
def pytest_collect_file(path, parent):
    if path.ext == ".py":
        return parent.Module(path, parent)

これにより、収集プロセスが拡張され、「。py」ファイルごとにテスト「モジュール」ノードが作成されます。これをconftest.pyファイルに入れると、プロジェクト固有の拡張子になり、次のように入力すると自動的に読み込まれます。

py.test 

情報提供の目的で、次のように入力することもできます。

py.test --collectonly

収集されるテストとファイルを確認するには、出力例:

<Directory 'morecollect'>
   <Module 'conftest.py'>
   <Directory 'pkg'>
     <Module 'test_x.py'>
        <Function 'test_hello2'>
   <Module 'x.py'>   # this is collected because of our conftest.py extension
     <Function 'test_hello'>

必要に応じて、上記のconftest.pyファイルをインストール可能なプラグインとしてパッケージ化し、プラグインをインストールして拡張機能を利用できるようにすることもできます。この場合、conftest.pyファイルはまったく必要ありません。

于 2010-09-14T07:58:41.960 に答える
5

プロジェクトのルートにファイル「setup.cfg」を配置します。このファイルには、次の2行が含まれています。

[pytest]
python_files=*.py

次に、py.testはすべての*.pyファイルからテストを選択します。ここで説明されています:pytest docs

鼻付き:

nosetests --all-modules
于 2012-04-07T07:15:28.303 に答える
5

固定のファイル名規則を使用せずにテストを検出するNoseを見ることもできます。

次のコードを使用すると、nose でファイルをフィルタリングするために使用される正規表現をバイパスできます。Pythonモジュールを作成します(つまりmy_nosetests.py

import nose
from nose.plugins.base import Plugin

class ExtensionPlugin(Plugin):

    name = "ExtensionPlugin"

    def options(self, parser, env):
        Plugin.options(self,parser,env)

    def configure(self, options, config):
        Plugin.configure(self, options, config)
        self.enabled = True

    def wantFile(self, file):
        return file.endswith('.py')

    def wantDirectory(self,directory):
        return True

    def wantModule(self,file):
        return True


if __name__ == '__main__':
    includeDirs = ["-w", ".", ".."]
    nose.main(addplugins=[ExtensionPlugin()], argv=sys.argv.extend(includeDirs))

実行my_nosetests.pyしているかのように実行するnosetestsと、テストが実行されます。実際にはすべてのモジュールをロードし、それらの中でテストを検索していることに注意してください。モジュールのロードによる副作用に注意してください。

于 2010-09-08T18:23:02.450 に答える
1

ドキュメントによると、

デフォルトでは、ドットで始まらないすべてのディレクトリがトラバースされ、test_*.py および *_test.py ファイルが検索されます。これらの Python ファイルは、パッケージ名でインポートされます。

これがあなたのコードに当てはまることを確認できますか?

アップデート

(警告 Emptor: 私はこれを試したりテストしたりしていません)ディレクトリとファイルを収集するために提供されているフックを使用するのはどうですか?

py.test は、ファイルとディレクトリを収集するために次の 2 つの基本的なフックを呼び出します。

def pytest_collect_directory(path, parent):
    """ return Collection node or None for the given path. """

def pytest_collect_file(path, parent):
    """ return Collection node or None for the given path. """

どちらも、指定されたパスのコレクション ノードを返します。すべてのフック実装から返されたすべてのノードは、コレクションと実行中のプロトコルに参加します。オブジェクトは親ノードであり、オブジェクトparentを介してコマンド ライン オプションにアクセスするために使用できparent.configます。

于 2010-09-08T17:49:21.890 に答える
0

pytest-6 の場合、@ hpk42 の回答を変更して、指定されたソース/テスト コード レイアウトの Module インスタンスを直接返す必要がありました。APIがその間に変更されたため、元の回答ではpytestのこのメジャーバージョンの例外が発生しました。

def pytest_collect_file(path, parent):
    """Look in all Python files for test cases."""
    from _pytest.python import Module

    if path.ext == ".py":
        return Module.from_parent(parent, fspath=path)
于 2021-09-29T08:51:03.700 に答える