次のようなことをするといいでしょう:
if settings.TESTING:
print("py.test is being ran")
"pytest" in sys.modules
?
テスト用に別の設定ファイルを使用して、自分で設定を追加できます
これが必要な場合は、 @ blueyedと@adamchainzによって提案されたアプローチで十分だと
pytestドキュメントからの関連する例pytest実行内から実行されているかどうかを検出します。
# content of conftest.py
def pytest_configure(config):
import sys
sys._called_from_test = True
def pytest_unconfigure(config):
import sys
del sys._called_from_test
問題は、 pytest_configure
がsettings.py
後に実行されることです。 settings.py
前にこのコードを実行する方法はありますか?
@axil
'pytest' in sys.modules
を使用することの何が問題になっていますか?
うーん、はい、それは機能しましたが、私には少しハッキーに見えます。
settings.pyでこれをチェックするもう1つの迅速で汚い方法は
TESTING = os.path.basename(sys.argv[0]) in ('pytest', 'py.test')
@axil
'pytest' in sys.modules
を使用することの何が問題になっていますか?
pytestがインポートされたという事実は、 pytest
が実行されており、コードがテストから呼び出されていることを意味するものではありません。 基本的に、他の何かのために私のインポートpytest
1つ。 また、pytestはCLIヘルプを表示するだけでもpytest
インポートしています:pytest --help
非常に有効なユースケースは次のとおりです。
さまざまなクレデンシャルやその他のローカル開発環境構成を配置するローカルファイルと変数を使用して、django設定を構成できます。 しかし、ユニットテストでこの資格情報や特定の設定を使用して、実際のシステムで誤って使用したり(不適切にモックされた場合)、ローカルの開発環境構成で合格/不合格になったりしないようにしたいと思います。 したがって、pytestで実行した場合、これらのローカル設定を除外する必要があります。
私は次のようなものを持っています:
import os
import os.path
import sys
from split_settings.tools import include, optional
def is_pytest_running():
return (os.getenv('PYTEST_RUNNING') == 'true' or
os.path.basename(sys.argv[0]) in ('pytest', 'py.test'))
ENVVAR_SETTINGS_PREFIX = 'MV_SERVER_'
local_settings_path = os.getenv(f'{ENVVAR_SETTINGS_PREFIX}SETTINGS', '../../../local/settings.py')
includes = [
'base.py',
'logging.py',
'custom.py',
]
if not is_pytest_running():
includes.append(optional(local_settings_path))
includes.append('envvars.py')
include(*includes)
os.getenv('PYTEST_RUNNING') == 'true'
は、多かれ少なかれクリーンな方法ですが、問題はこの変数の設定にあります。 conftest.pyが実行される前にpytest-djangoが設定をインポートするため、conftest.pyでの設定は機能しません。 pytestの実行時にコマンドラインで設定するのは不便であり、目的も損なわれます。設定を忘れた場合、ローカルのdevenv構成から実際の資格情報が使用されます。
os.path.basename(sys.argv [0])in( 'pytest'、 'py.test')
sys.argv[0]
が/home/project/venv/lib/python3.8/site-packages/pytest/__main__.py
として出てきたので、 os.path.basename(os.path.dirname(sys.argv[0])) in ('pytest', 'py.test')
に変更する必要がありました。
最も参考になるコメント
"pytest" in sys.modules
?