68

私は、一連のクラスを使用してセレンテストを作成しています。各クラスにはいくつかのテストが含まれています。現在、各クラスは Firefox を開いてから閉じます。これには 2 つの結果があります。

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

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

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

4

4 に答える 4

95

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

さらに2つの解決策があります:

競合フック

ファイルにpytest_configureorpytest_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 プラグインを作成します。 でプラグインを有効にします。pytest_configurepytest_unconfigure
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
于 2016-02-14T16:39:52.900 に答える
83

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

# 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)

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

于 2013-07-24T21:14:51.307 に答える
27

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

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

autouse パラメータ:ドキュメント から:

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

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

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

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

    ...

「request」パラメーター: 「request」パラメーターは、他の目的で使用することもできますが、目的には必要ないことに注意してください。ドキュメントから:

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

于 2016-10-20T13:17:16.070 に答える