Ответ 1
Наконец-то я нашел ответ, который я искал.
мы можем установить такие переменные среды, как это, прежде чем запускать тесты, используя py.test
ENV_NAME = 'этап' ENV_NUMBER = '5' py.test
Прежде чем начать выполнение тестов в моем проекте python, я прочитал некоторые переменные среды и установил некоторые переменные с этими значениями. Мои тесты будут работать в нужной среде на основе этих значений.
например: пусть говорят, что переменные среды называются "ENV_NAME" и "ENV_NUMBER"
Теперь я хотел бы запустить тесты, используя py.test
Если я жестко закодирую эти переменные среды, например, ENV_NAME = 'staging', ENV_NUMBER = '5' в моем коде, а затем запустите тесты, выполнив команду py.test в корне каталога проекта, все тесты успешно выполняются.
Но я не хочу жестко кодировать эти значения. Есть ли способ, я могу отправить эти переменные среды в качестве аргументов командной строки для py.test?
Я думал больше в строках
py.test -ENV_NAME = 'этап' -ENV_NUMBER = '5'. Но это не работает.
Пожалуйста, помогите! Спасибо!
Наконец-то я нашел ответ, который я искал.
мы можем установить такие переменные среды, как это, прежде чем запускать тесты, используя py.test
ENV_NAME = 'этап' ENV_NUMBER = '5' py.test
Другой вариант - использовать плагин pytest-env. Его можно настроить так:
[pytest]
env =
HOME=~/tmp
D:RUN_ENV=test
префикс D:
позволяет установить значение по умолчанию, а не переопределять существующие переменные, переданные в py.test
.
Примечание: вы можете явно запустить pytest с настраиваемой конфигурацией, если вам иногда требуется только создать специализированную среду:
pytest -c custom_pytest.ini
Есть несколько способов добиться этого.
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"]
В дополнение к другим ответам. Существует возможность перезаписать 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 будет доступна в вашем приложении.
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')
Мне нужно было создать файл pytest.ini
и передать переменные среды в команду pytest
. Например:
В файле pytest.ini я установил пустое значение, потому что оно перезаписывается тем, что вы передаете команде командной строки:
[pytest]
MY_ENV_VAR=
Командная строка с установленным фактическим значением:
$ MY_ENV_VAR=something pytest -c pytest.ini -s tests/**
Я не знаю, почему это так работает. Я только что узнал, что это работает в результате простого метода проб и ошибок, потому что другие ответы не помогли мне.