Skip to main content

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

Project description

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytest_envx-2.0.0.tar.gz (13.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytest_envx-2.0.0-py3-none-any.whl (7.0 kB view details)

Uploaded Python 3

File details

Details for the file pytest_envx-2.0.0.tar.gz.

File metadata

  • Download URL: pytest_envx-2.0.0.tar.gz
  • Upload date:
  • Size: 13.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for pytest_envx-2.0.0.tar.gz
Algorithm Hash digest
SHA256 bbccf3c1a2c375ff6810613a0f24767eabf93334e0577c578f06194638fec842
MD5 13835c1926451178bd650072933cc908
BLAKE2b-256 d3128d1a4bd4b12af896c709f2ce11436158a64616e4f96ec4cbc3495326a5a5

See more details on using hashes here.

File details

Details for the file pytest_envx-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: pytest_envx-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 7.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for pytest_envx-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9ae0fcc2a6c9870a5ab51fc56e628f0f9c5b22e9beae28f8ad957eee6da23a11
MD5 a2cd276237b08814d59494e593181e0e
BLAKE2b-256 d8c8fa2ad8d78f71aa3b7773302102f4997f5cbebc4c0c211894b937cadd7503

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page