web-dev-qa-db-ja.com

py.testセッション内からコードが実行されるかどうかをテストする

コードがpy.testで実行されている場合、別のデータベースに接続したいと思います。 py.testセッションで実行しているかどうかを確認できる、呼び出す関数またはテストできる環境変数はありますか?これを処理する最良の方法は何ですか?

43
Laizer

ソリューションは [〜#〜] rtfm [〜#〜] から来ましたが、明白な場所ではありませんでした。マニュアルのコードにもエラーがありました。以下で修正しました。

pytest run内から実行されているかどうかを検出します

通常、テストから呼び出された場合にアプリケーションコードの動作を変えることはお勧めできません。しかし、アプリケーションコードがテストから実行されているかどうかを絶対に確認する必要がある場合は、次のようなことができます。

# content of conftest.py
def pytest_configure(config):
    import sys
    sys._called_from_test = True

def pytest_unconfigure(config):
    import sys  # This was missing from the manual
    del sys._called_from_test

次に、sys._called_from_testフラグを確認します。

if hasattr(sys, '_called_from_test'):
    # called from within a test run
else:
    # called "normally"

アプリケーションに応じて。フラグの処理には、sysではなく独自のアプリケーションモジュールを使用することもお勧めします。

33
Laizer

私がたどった簡単な解決策:

import sys

if "pytest" in sys.modules:
    ...

Pytest runnerは常にpytestモジュールをロードし、sys.modulesで使用できるようにします。

もちろん、この解決策は、テストしようとしているコードがpytest自体を使用していない場合にのみ機能します。

41
ramnes

マニュアルに記載されている別の方法もあります: https://docs.pytest.org/en/latest/example/simple.html#pytest-current-test-environment-variable

Pytestは次の環境変数を設定しますPYTEST_CURRENT_TEST

上記の変数の存在をチェックすることで、コードがpytestの傘から実行されているかどうかを確実に検出できるはずです。

import os
if "PYTEST_CURRENT_TEST" in os.environ:
    # We are running under pytest, act accordingly...
10
cgons

一緒に働く pytest==4.3.1上記の方法が失敗したため、私は古い学校に行って次のことを確認しました。

if 'pytest' in sys.argv[0]:
  print('pytest was called!')
3
duhaime

これは、テストコード内で環境変数を設定することで実行できます。たとえば、プロジェクトが

conftest.py
mypkg/
    __init__.py
    app.py
tests/
    test_app.py

test_app.py あなたは付け加えられます

import os
os.environ['PYTEST_RUNNING'] = 'true'

そして、中を確認できますapp.py

import os
if os.environ.get('PYTEST_RUNNING', '') == 'true':
    print('pytest is running')
1
AlexG