web-dev-qa-db-ja.com

環境変数をpytestに渡す方法

pythonプロジェクトでテストの実行を開始する前に、いくつかの環境変数を読み取り、読み取ったこれらの値でいくつかの変数を設定します。読み取った値に基づいて、目的の環境でテストを実行します.

例えば:環境変数が「ENV_NAME」と「ENV_NUMBER」と呼ばれるとしましょう

今、私はpy.testを使用してテストを実行したいと思います

ENV_NAME = 'staging'、ENV_NUMBER = '5'などの環境変数をハードコードし、プロジェクトディレクトリのルートでpy.testコマンドを実行してテストを実行すると、すべてのテストが正常に実行されます。 。

しかし、これらの値をハードコーディングしたくありません。方法はありますか、これらの環境変数をpy.testのコマンドライン引数として送信できますか?

私はの行でもっと考えていました

py.test -ENV_NAME = 'staging' -ENV_NUMBER = '5'。しかし、これは機能していません。

助けてください!ありがとうございました!

43
sridhar249

私は最終的に私が探していた答えを見つけました。

py.testを使用してテストを実行する前に、このような環境変数を設定できます

ENV_NAME = 'staging' ENV_NUMBER = '5' py.test

11
sridhar249

別の方法は、 pytest-env プラグインを使用することです。次のように構成できます。

[pytest]
env = 
    HOME=~/tmp
    D:RUN_ENV=test

D:プレフィックスはデフォルト値の設定を許可し、py.testに渡される既存の変数をオーバーライドしません。

:特別な環境設定を実行する必要がある場合のみ、カスタム設定で明示的にpytestを実行できます:

pytest -c custom_pytest.ini
43
tutuDajuju

これを達成する方法はいくつかあります

1)環境変数を使用したくない場合は、pytest addoptionsを https://pytest.org/latest/example/simple.html として使用できます

2)このようなラッパースクリプトを記述して、環境変数を呼び出すことができます。

   import os
   import py
   env_name = os.environ["ENV_NAME"]
   env_no = os.environ["ENV_NUMBER"]
   pytest_args=(env_name,env_no)
   pytest.main('-s' ,pytest_args,test_file.py) 

test_file.pyで使用できます

   env_n, env_n = pytest.config.getoption('pytest_args')

3)環境変数が設定されていない日付を渡すだけの場合の代替方法

コマンドラインで次のように使用できます

   py.test --testdata ="ENV_NAME:staging,ENV_NUMBER:5"

テストファイルで使用できます

pytest_params = pytest.config.getoption('testdata')
params = pytest_params.split(":")
param_dict = dict(params[i:i+2] for i in range(0,len(params),2))
env_name = param_dict["ENV_Name"]
10
Macintosh_89

他の答えに加えて。 pytest_generate_testsconftest.pyを上書きし、そこでENV変数を設定するオプションがあります。

たとえば、次をconftest.pyに追加します。

import os

def pytest_generate_tests(metafunc):
        os.environ['TEST_NAME'] = 'My super test name| Python version {}'.format(python_version)

このコードを使用すると、テストアプリケーションでTEST_NAME ENV変数を取得できます。また、フィクスチャを作成することもできます。

import os
import pytest

@pytest.fixture
def the_name():
    return os.environ.get('TEST_NAME')

また、このENV変数はアプリケーションで使用できます。

3
Infernion

1.関数外の環境変数変数をロードしない場合、モンキーパッチを使用します。

import os

# success.py
def hello_world():
    return os.environ["HELLO"]

# fail.py
global_ref = os.environ["HELLO"] # KeyError occurs this line because getting environment variable before monkeypatching

def hello_world():
    return global_ref

# test.py
def test_hello_world(monkeypatch):
    # Setup
    envs = {
        'HELLO': 'world'
    }
    monkeypatch.setattr(os, 'environ', envs)

    # Test
    result = hello_world()

    # Verify
    assert(result == 'world')
  1. PyCharmを使用する場合、環境変数を設定できます。[実行]-> [構成の編集]-> [デフォルト]-> [py.tests]-> [環境変数]

enter image description here

2
MiaeKim

pytest.iniファイルを作成する必要がありましたおよび環境変数をpytestコマンドに渡します。例えば:

Pytest.iniファイルでは、コマンドラインコマンドに渡すものによって上書きされるため、空の値を設定します。

[pytest]
MY_ENV_VAR=

実際の値が設定されたコマンドライン:

$ MY_ENV_VAR=something pytest -c pytest.ini -s tests/**

なぜこのように機能するのか分かりません。他の答えは役に立たなかったため、単なる試行錯誤の結果として機能することがわかりました。

0
clapas