1

目標: テスト コレクションの前に、pytest キャッシュにランダムな値を設定する必要があります。

問題: オプション master を指定して pytest-xdist を使用してテストを並行して実行する--cache-clearと、各ワーカーがキャッシュをクリアするため、値を設定する前にすべてのワーカーの準備が整っていることを確認する必要があります。

考えられる解決策:

def pytest_configure(config):
    if (
        hasattr(config, "workerinput")
        and "--cache-clear" in config.invocation_params.args
    ):
        # if it's worker of parallel run with cache clearing,
        # need to wait to make sure that all workers are started.
        # Otherwise, the next started worker will clear cache and create
        # a new organization name
        time.sleep(10)

    name = config.cache.get(CACHE_ORG_KEY, None)
    if not name:
        name = <set random value>
        config.cache.set(CACHE_ORG_KEY, name)

それは正常に動作します。10 秒のスリープがあり、すべてのワーカー (ノード) を開始するのに十分なようです。すべてのワーカーが開始され、すべてのワーカーがキャッシュをクリアします。最初のものは値をキャッシュに設定し、他の人はそれを取得します。しかし、私はこのアプローチが好きではありません。なぜなら、すべてのワーカーが開始され、余分な待ち時間が発生するという保証がないからです。

私は他のアプローチについて考えます:

  1. ワーカーのキャッシュのクリアを無効にする
  2. すべてのワーカーが開始されていることを確認します

しかし、私はそれを行う方法を理解できません。何か案は?

更新番号 1。最小限の再現可能な例

要件:

pytest==6.2.5
pytest-xdist==2.5.0

コード:

conftest.py

import time

from test_clear_cache import set_name


def pytest_configure(config):
    # if (
    #     hasattr(config, "workerinput")
    #     and "--cache-clear" in config.invocation_params.args
    # ):
    #     time.sleep(10)
    name = config.cache.get("name", None)
    if not name:
        name = f"name_{time.time_ns()}"
        config.cache.set("name", name)
    set_name(name)

test_clear_cache.py

import sys

NAME = "default"


def set_name(name):
    global NAME
    NAME = name


def test_clear_cache1():
    print(f"Test #1: {NAME}", file=sys.stderr)


def test_clear_cache2():
    print(f"Test #2: {NAME}", file=sys.stderr)


def test_clear_cache3():
    print(f"Test #3: {NAME}", file=sys.stderr)


def test_clear_cache4():
    print(f"Test #4: {NAME}", file=sys.stderr)

出力:

(venv) C:\Users\HP\PycharmProjects\PytestCacheClear>pytest -s -n=4 --cache-clear
========================================================================================================== test session starts ===========================================================================================================
platform win32 -- Python 3.7.8, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: C:\Users\HP\PycharmProjects\PytestCacheClear
plugins: forked-1.4.0, xdist-2.5.0
gw0 [4] / gw1 [4] / gw2 [4] / gw3 [4]
Test #4: name_1643377905887805600
Test #3: name_1643377905816748300
Test #2: name_1643377905735875700
Test #1: name_1643377905645880100
....
=========================================================================================================== 4 passed in 0.61s ============================================================================================================

注:conftest.pyテストでコードのコメントを外すと、同じ名前が出力されます。

4

0 に答える 0