Как передать переменную окружения в командной строке в pytest для проверки функции - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть сценарий, использующий os.environ.get () для получения переменной из командной строки, например, JENKINS_HOST = "xx" JENKINS_AUTH = "xx" JENKINS_TOKEN = "xx" python script.py

В сценарии.py имеет функцию, которой это нравится:

def init_auth():
    login_mode = True
    JENKINS_HOST = os.environ.get("JENKINS_HOST")
    JENKINS_AUTH = os.environ.get("JENKINS_AUTH")
    JENKINS_TOKEN = os.environ.get("JENKINS_TOKEN")

когда я использую pytest для тестирования функции init_auth (), как я могу передать среду cli в эту функцию?

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Предположим, вы хотите протестировать функцию, подобную этой:

def foo():
    something = os.environ.get("SOMETHING")
    if something=="BAD":
       raise Exception("BAM")

Она используется в небольшом приложении вроде этого:

def main():
   try:
      foo()
      print("OK")
   except:
      print("SAD")

Я могу указать значения среды в командестрока, которая в итоге достигает foo

$ SOMETHING=BAD ./my_app
SAD
$ SOMETHING=ELSE ./my_app
OK

Теперь я хочу протестировать поведение foo, но мне нужно быть осторожным, чтобы не изменять настройки среды, поэтому мне нужно установить и восстановить их,даже если тест пройдёт плохо.Это выглядит примерно так:

def test_foo_ok():
  orig = os.environ.get("SOMETHING")
  os.environ["SOMETHING"]="ELSE"
  try:
     foo()
  finally:
     if orig is None:
        del os.environ["SOMETHING"]
     else:
        os.environ["SOMETHING"]=orig

def test_foo_bad():
  orig = os.environ.get("SOMETHING")
  os.environ["SOMETHING"]="BAD"
  try:
    with pytest.raises(Exception) as excinfo:   
        foo()   
    assert str(excinfo.value) == "BAM" 
  finally:
     if orig is None:
        del os.environ["SOMETHING"]
     else:
        os.environ["SOMETHING"]=orig

Вы можете обернуть шаблон в них, если хотите.Я бы назвал это что-то вроде @testwithenv, тогда тесты будут выглядеть чище.

@testwithenv({"SOMETHING","ELSE"})
def test_foo_ok():
  foo()

@testwithenv({"SOMETHING","BAD"})
def test_foo_bad():
  with pytest.raises(Exception) as excinfo:   
    foo()   
  assert str(excinfo.value) == "BAM" 
0 голосов
/ 08 марта 2019

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

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

conftest.py :

def pytest_addoption(parser):
    """
    Add CLI options to `pytest` to pass those options to the test cases.
    These options are used in `pytest_generate_tests`.
    """
    parser.addoption('--jenkins-host')
    parser.addoption('--jenkins-auth')
    parser.addoption('--jenkins-token')

def pytest_generate_tests(metafunc):
    metafunc.parametrize(
        'jenkins_host, jenkins_auth, jenkins_token',
        [(metafunc.config.getoption('jenkins_host'),
          metafunc.config.getoption('jenkins_auth'),
          metafunc.config.getoption(jenkins_token'))]

TestFile.py

class TestThis:
    def test_my_thing(jenkins_host, jenkins_auth, jenkins_token):
        # Do tests here

CLI

pytest TestFile.py --jenkins-host "http://my-jenkinshost.com" --jenkins-auth whatever --jenkins-token THE_TOKEN

Аргументы в тестовом примере параметризованы (эквивалент добавления аннотации @pytest.mark.parametrize(...) in pytest_generate_tests.

Это хорошо работает и полностью поддерживается pytest. Это базовый пример, поскольку вы можете сделать гораздо больше. См. здесь дополнительную информацию о том, какэти и другие крючки работают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...