目標: テスト コレクションの前に、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。最小限の再現可能な例
要件:
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
テストでコードのコメントを外すと、同じ名前が出力されます。