Как в pytest установить переменную среды на основе выражения оболочки bash? - PullRequest
2 голосов
/ 05 августа 2020

Я использую Python 3.8 и pytest. У меня есть этот файл pytest.ini ...

[pytest]
env_override_existing_values = 1
env_files =
    tests/.test_env

Мои тесты / .test_env содержат

TZ=`ls -la /etc/localtime | cut -d/ -f8-9`

Однако это буквально оценивается в моем pytest - это TZ. равно "ls -la / etc / localtime | cut -d / -f8-9". Есть ли способ настроить мою переменную env для pytest, чтобы она была результатом выражения, когда я запускаю «pytest tests / my_test.py»? К вашему сведению, это не вариант делать что-то вроде "TZ = ls -la /etc/localtime | cut -d/ -f8-9; pytest tests / my_test.py"

Ответы [ 3 ]

1 голос
/ 12 августа 2020

Итак, если я правильно понимаю, вы хотите установить envvar в процессе pytest без использования каких-либо внешних параметров. Вы можете использовать инструмент pytest с привязкой к сеансу в conftest.py следующим образом:

$ cat conftest.py
import os
import subprocess

import pytest


@pytest.fixture(scope="session", autouse=True)
def setenv():
    process = subprocess.run("ls -la /etc/localtime | cut -d/ -f8-9", shell=True, capture_output=True)
    os.environ["TZ"] = process.stdout.decode("utf8")

$ cat test_foo.py
import os


def test_my_test():
    print(os.environ["TZ"])
$ pytest -s
================================================================================= test session starts ==================================================================================
platform linux -- Python 3.8.2, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: /tmp/testy
collected 1 item                                                                                                                                                                       

test_foo.py New York

.

================================================================================== 1 passed in 0.01s ===================================================================================
$ echo $TZ

$
0 голосов
/ 06 августа 2020

(документация pytest) [https://pypi.org/project/pytest-envfiles/] предполагает, что файлы, используемые директивой pytest "env_files", должны содержать буквальные key=val строки. Да, в документации нет ясности относительно формата файлов env pytest. Так что ваше неверное ожидание, что эти файлы будут «оценены» с помощью вашей $SHELL программы, не говоря уже о любом другом, неудивительно.

Я не понимаю, почему вы не можете do something like "TZ=ls -la /etc/localtime | cut -d/ -f8-9; pytest tests/my_test.py". Кроме того, вы, очевидно, пытаетесь явно установить $TZ в часовой пояс по умолчанию для платформы. Зачем? Это должно быть по умолчанию. Это предполагает, что существует более глубокая проблема. То есть вы задаете вопрос xyproblem.info .

0 голосов
/ 06 августа 2020

Итак, в основном pytest.ini может содержать:

[pytest]
TZ=

Затем вы можете передать его в строке cmd как:

$ TZ=`ls -la /etc/localtime | cut -d/ -f8-9` pytest -c pytest.ini -s tests/**
...