Как передать переменные среды в pytest

Прежде чем начать выполнение тестов в моем проекте python, я прочитал некоторые переменные среды и установил некоторые переменные с этими значениями. Мои тесты будут работать в нужной среде на основе этих значений.

например: пусть говорят, что переменные среды называются "ENV_NAME" и "ENV_NUMBER"

Теперь я хотел бы запустить тесты, используя py.test

Если я жестко закодирую эти переменные среды, например, ENV_NAME = 'staging', ENV_NUMBER = '5' в моем коде, а затем запустите тесты, выполнив команду py.test в корне каталога проекта, все тесты успешно выполняются.

Но я не хочу жестко кодировать эти значения. Есть ли способ, я могу отправить эти переменные среды в качестве аргументов командной строки для py.test?

Я думал больше в строках

py.test -ENV_NAME = 'этап' -ENV_NUMBER = '5'. Но это не работает.

Пожалуйста, помогите! Спасибо!

Ответ 1

Наконец-то я нашел ответ, который я искал.

мы можем установить такие переменные среды, как это, прежде чем запускать тесты, используя py.test

ENV_NAME = 'этап' ENV_NUMBER = '5' py.test

Ответ 2

Другой вариант - использовать плагин pytest-env. Его можно настроить так:

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

префикс D: позволяет установить значение по умолчанию, а не переопределять существующие переменные, переданные в py.test.

Примечание: вы можете явно запустить pytest с настраиваемой конфигурацией, если вам иногда требуется только создать специализированную среду:

pytest -c custom_pytest.ini

Ответ 3

Есть несколько способов добиться этого.

1) Если вы не хотите использовать переменную окружения, вы можете использовать pytest addoptions как https://pytest.org/latest/example/simple.html

2) Вы можете написать оболочку script следующим образом, чтобы вызвать переменные enviornment

   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) Альтернативный метод, если вы просто хотите передать дату, не заданную переменную enviornment

в командной строке вы можете использовать его как

   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"]

Ответ 4

В дополнение к другим ответам. Существует возможность перезаписать pytest_generate_tests в conftest.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 будет доступна в вашем приложении.

Ответ 5

1. Я использую monkey patch, когда не загружаю переменную среды вне функции.

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, вы можете установить переменные среды, [Run] → [Edit Configuration] → [Defaults] → [py.tests] → [Environment Variables]

enter image description here

Ответ 6

Мне нужно было создать файл pytest.ini и передать переменные среды в команду pytest. Например:

В файле pytest.ini я установил пустое значение, потому что оно перезаписывается тем, что вы передаете команде командной строки:

[pytest]
MY_ENV_VAR=

Командная строка с установленным фактическим значением:

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

Я не знаю, почему это так работает. Я только что узнал, что это работает в результате простого метода проб и ошибок, потому что другие ответы не помогли мне.