Pytest-django: Djangoがテストを実行しているかどうかを検出する方法を提供する

作成日 2016年05月06日  ·  9コメント  ·  ソース: pytest-dev/pytest-django

次のようなことをするといいでしょう:

if settings.TESTING:
    print("py.test is being ran")

最も参考になるコメント

"pytest" in sys.modules

全てのコメント9件

"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_configuresettings.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')に変更する必要がありました。

このページは役に立ちましたか?
0 / 5 - 0 評価