web-dev-qa-db-ja.com

すべてのクラスのすべてのテストの前にメソッドを実行する方法は?

私はクラスのセットでSeleniumテストを書いています。各クラスにはいくつかのテストが含まれています。現在、各クラスはFirefoxを開いてから閉じます。これには2つの影響があります。

  • 非常に遅く、Firefoxを開くのはクラスでテストを実行するよりも時間がかかります...
  • クラッシュします。Firefoxを閉じた後、Seleniumから非常にすばやく再起動しようとすると、「エラー54」が発生するためです。

エラー54はおそらくスリープを追加することで解決できますが、それでも非常に遅いでしょう。

だから、私がやりたいのはallテストクラス全体で同じFirefoxインスタンスを再利用することです。つまり、すべてのテストクラスの前にメソッドを実行し、すべてのテストクラスの後に別のメソッドを実行する必要があります。したがって、「setup_class」と「teardown_class」では不十分です。

36
Hugh Perkins

セッションスコープの「自動使用」フィクスチャを使用することもできます。

# content of conftest.py or a tests file (e.g. in your tests or root directory)

@pytest.fixture(scope="session", autouse=True)
def do_something(request):
    # prepare something ahead of all tests
    request.addfinalizer(finalizer_function)

これはすべてのテストよりも先に実行されます。ファイナライザは、最後のテストが終了した後に呼び出されます。

46
hpk42

hpk42 で提案されているようにセッションフィクスチャを使用することは、多くの場合優れたソリューションですが、フィクスチャはすべてのテストが収集された後にのみ実行されます。

さらに2つのソリューションがあります。

conftestフック

pytest_configure または pytest_sessionstart フックをconftest.pyファイルに書き込みます。

# content of conftest.py


def pytest_configure(config):
    """
    Allows plugins and conftest files to perform initial configuration.
    This hook is called for every plugin and initial conftest
    file after command line options have been parsed.
    """


def pytest_sessionstart(session):
    """
    Called after the Session object has been created and
    before performing collection and entering the run test loop.
    """


def pytest_sessionfinish(session, exitstatus):
    """
    Called after whole test run finished, right before
    returning the exit status to the system.
    """


def pytest_unconfigure(config):
    """
    called before test process is exited.
    """

pytestプラグイン

pytest_configureおよびpytest_unconfigureフックを使用して pytestプラグイン を作成します。
conftest.pyでプラグインを有効にします:

# content of conftest.py

pytest_plugins = [
    'plugins.example_plugin',
]


# content of plugins/example_plugin.py
def pytest_configure(config):
    pass


def pytest_unconfigure(config):
    pass
52
draganHR

バージョン2.10以降、フィクスチャを破棄し、そのスコープを定義するためのより明確な方法があります。したがって、次の構文を使用できます。

@pytest.fixture(scope="module", autouse=True)
def my_fixture():
    print ('INITIALIZATION')
    yield param
    print ('TEAR DOWN')

autouseパラメーター:From documentation

Autouseフィクスチャが他のスコープでどのように機能するかを次に示します。

  • autouseフィクスチャは、scope =キーワード引数に従います。autouseフィクスチャにscope = 'session'がある場合、それがどこで定義されているかに関係なく、1回だけ実行されます。 scope = 'class'は、クラスごとに1回実行されることを意味します。

  • 自動使用フィクスチャがテストモジュールで定義されている場合、そのすべてのテスト機能が自動的に使用します。

  • autouseフィクスチャがconftest.pyファイルで定義されている場合、そのディレクトリの下にあるすべてのテストモジュールのすべてのテストがフィクスチャを呼び出します。

    ...

「リクエスト」パラメータ:「リクエスト」パラメータは、他の目的に使用することもできますが、目的には必要ありません。 ドキュメント から:

「フィクスチャ関数は、リクエストオブジェクトを受け入れて、「リクエストしている」テスト関数、クラス、またはモジュールコンテキストをイントロスペクトできます。」

16
Pavel Rogovoy