Skip to content

eugeneliukindev/pytest-envx

Repository files navigation

logo

PyPI version Python versions codecov License

🌍 Select Language

🔧 pytest-envx

pytest-envx is a powerful and user-friendly plugin for pytest, allowing you to easily manage environment variables from configuration files like pyproject.toml and pytest.ini.


🚀 Features

  • ✔️ Environment variable interpolation via templates
  • ✔️ Load variables from .env files
  • ✔️ Compatible with both pyproject.toml and pytest.ini
  • ✔️ Easy to configure and use
  • ✔️ Flexible support for overriding and loading order

⚡️ Installation

pip install pytest-envx

📦 Quick Start

Create a configuration file — either pyproject.toml ⚙️ or pytest.ini ⚙️ By default, pytest prioritizes pytest.ini ⚙️

✅ Example 1: Simple Variable

pyproject.toml ⚙️ pytest.ini ⚙️
[tool.pytest.ini_options]
env = [
    "HELLO='WORLD'"
]
[pytest]
env =
    HELLO="WORLD"

test_example.py 🐍:

import os

def test_env_var():
    assert os.getenv("HELLO") == "WORLD"

✅ Example 2: Load from .env 🔐 files with override

.env-template 🔐 .env 🔐
NAME=ALICE
LASTNAME=BAILER
      
NAME=BOB
      
pyproject.toml ⚙️ pytest.ini ⚙️
[tool.pytest.ini_options]
envx_metadata = { paths_to_load = [".env-template", ".env"], override_load = true }
env = [
    "GREETING='Hello'"
]
      
[pytest]
envx_metadata = {"paths_to_load": [".env-template", ".env"], "override_load": True}
env =
    GREETING="Hello"
      

test_env_load.py 🐍:

import os

def test_env_loading():
    assert os.getenv("NAME") == "BOB"
    assert os.getenv("LASTNAME") == "BAILER"
    assert os.getenv("GREETING") == "Hello"

✅ Example 3: Load from .env 🔐 files without override

.env.default 🔐 .env.dev 🔐
MODE=default
      
MODE=development
LEVEL=DEV
      
pyproject.toml ⚙️ pytest.ini ⚙️
[tool.pytest.ini_options]
envx_metadata = { paths_to_load = [".env.default", ".env.dev"], override_load = false }
      
[pytest]
envx_metadata = {"paths_to_load": [".env.default", ".env.dev"], "override_load": False}
      

test_priority.py 🐍:

import os

def test_env_priority():
    assert os.getenv("MODE") == "default"
    assert os.getenv("LEVEL") == "DEV"

✅ Example 4: Variable Interpolation

.env 🔐
USER=john
PASS=secret
HOST=db.local
PORT=5432
      
pyproject.toml ⚙️ pytest.ini ⚙️
[tool.pytest.ini_options]
envx_metadata = { paths_to_interpolate = [".env"] }
env = [
    "DB_URL_WITH_INTERPOLATION='postgresql://{%USER%}:{%PASS%}@{%HOST%}:{%PORT%}/app'",
    "WITHOUT_INTERPOLATION={'value': '{%USER%}', 'interpolate': False}",
    "NOT_FOUND='{%NOT_FOUND%}'"
]
      
[pytest]
envx_metadata = {"paths_to_interpolate": [".env"]}
env =
    DB_URL_WITH_INTERPOLATION="postgresql://{%USER%}:{%PASS%}@{%HOST%}:{%PORT%}/app"
    WITHOUT_INTERPOLATION={"value": "{%USER%}", "interpolate": False}
    NOT_FOUND = "{%NOT_FOUND%}"
      

test_interpolation.py 🐍:

import os

def test_interpolated_value():
    assert os.getenv("DB_URL_WITH_INTERPOLATION") == "postgresql://john:secret@db.local:5432/app"
    assert os.getenv("WITHOUT_INTERPOLATION") == "{%USER%}"
    assert os.getenv("NOT_FOUND") == "{%NOT_FOUND%}"
    assert os.getenv("USER") !=  "john"
    assert os.getenv("PASS") !=  "secret"
    assert os.getenv("HOST") !=  "db.local"
    assert os.getenv("PORT") !=  "5432"

⚙️ envx_metadata

Parameter Type Description
paths_to_load list Paths to .env files to load environment variables from (loaded in order)
override_load (bool, default=True) Whether to override existing environment variables during load
paths_to_interpolate list Paths to files for value interpolation
override_interpolate (bool, default=True) Whether to override variables during interpolation

📄 License

MIT

About

Pytest plugin for managing environment variables with interpolation and .env file support.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages