tests/ ├── test_example.py # Test files ├── conftest.py # Shared fixtures and hooks utils/ ├── helpers.py # Utility functions configs/ ├── config.yaml # Environment and test configs reports/ ├── latest_report.html # Test reports
monkeypatch.setenv in PyTest - Framework Patterns
- Test Layer: Contains test functions using pytest syntax, e.g., test_example.py.
- Fixture Layer: conftest.py holds fixtures like monkeypatch for environment setup.
- Utility Layer: Helper functions to support tests, e.g., reading configs or common actions.
- Configuration Layer: YAML or JSON files to manage environment variables, URLs, credentials.
Use monkeypatch.setenv in fixtures to temporarily set environment variables during tests.
Example fixture in conftest.py:
import pytest
@pytest.fixture
def set_test_env(monkeypatch):
monkeypatch.setenv("API_KEY", "testkey123")
monkeypatch.setenv("ENV", "test")
yield
# Environment variables reset automatically after test
Use config files (e.g., config.yaml) to store environment-specific values and load them in tests or fixtures.
- Use pytest built-in options like
--junitxml=reports/report.xmlfor XML reports. - Generate HTML reports with plugins like
pytest-htmlto createreports/latest_report.html. - Integrate tests in CI/CD pipelines (GitHub Actions, Jenkins) to run tests and publish reports automatically.
- Use environment variables set by CI tools or override them with
monkeypatch.setenvduring local tests.
- Isolate Environment Changes: Use
monkeypatch.setenvin fixtures to avoid side effects on other tests. - Keep Tests Independent: Each test should set its own environment variables to prevent hidden dependencies.
- Use conftest.py for Shared Fixtures: Centralize environment setup for reuse and clarity.
- Clean Up Automatically: monkeypatch resets environment after test, so no manual cleanup needed.
- Combine with Config Files: Load environment values from config files and apply them with monkeypatch for flexibility.
Where in this pytest framework structure would you add a new fixture that sets an environment variable DATABASE_URL for tests?
Practice
What is the main purpose of monkeypatch.setenv in pytest?
Solution
Step 1: Understand the role of monkeypatch in pytest
Monkeypatch is used to temporarily modify or replace parts of the environment during tests without permanent effects.Step 2: Focus on setenv method
The setenv method specifically changes environment variables only for the duration of the test.Final Answer:
Temporarily change environment variables during a test -> Option CQuick Check:
monkeypatch.setenv = temporary env change [OK]
- Thinking setenv changes env variables permanently
- Confusing setenv with creating new system variables
- Assuming changes persist after test ends
Which of the following is the correct syntax to set an environment variable API_KEY to 12345 using monkeypatch.setenv in a pytest test function?
def test_api_key(monkeypatch):
# Your code here
assert ...Solution
Step 1: Check method signature of setenv
setenv takes two string arguments: the variable name and its value.Step 2: Identify correct string usage
The value must be a string, so '12345' is correct, not integer 12345.Final Answer:
monkeypatch.setenv('API_KEY', '12345') -> Option AQuick Check:
setenv('VAR', 'value') syntax [OK]
- Passing integer instead of string as value
- Using keyword arguments instead of positional
- Trying to assign value with '=' outside method call
What will be the output of the following pytest test?
import os
def test_env(monkeypatch):
monkeypatch.setenv('MODE', 'test')
mode = os.getenv('MODE')
assert mode == 'test'
print(mode)Solution
Step 1: Understand monkeypatch.setenv effect
It sets environment variable 'MODE' to 'test' temporarily during the test.Step 2: Check os.getenv call and assertion
os.getenv('MODE') returns 'test', so assertion passes and print outputs 'test'.Final Answer:
test -> Option DQuick Check:
setenv sets env var, getenv reads it [OK]
- Expecting None because env var not set globally
- Thinking assertion fails
- Confusing variable name with value
Identify the error in this pytest test using monkeypatch.setenv:
def test_path(monkeypatch):
monkeypatch.setenv(PATH)
assert os.getenv('PATH') == '/usr/bin'Solution
Step 1: Check setenv method call
setenv requires two arguments: variable name and value. Here only one argument is given.Step 2: Verify assertion and imports
Assertion syntax is correct and os module import is assumed; error is in setenv call.Final Answer:
setenv missing value argument -> Option BQuick Check:
setenv needs two args: name and value [OK]
- Calling setenv with only one argument
- Forgetting to import os module
- Miswriting assertion statement
You want to test a function that behaves differently based on the environment variable FEATURE_FLAG. Which pytest test code correctly uses monkeypatch.setenv to test the function with FEATURE_FLAG set to enabled and ensures the environment is restored after the test?
def test_feature(monkeypatch):
# Your code here
result = feature_function()
assert result == 'Feature Enabled'Solution
Step 1: Identify correct usage of monkeypatch.setenv
setenv requires two string arguments: variable name and value, passed positionally.Step 2: Understand environment restoration
Using monkeypatch.setenv ensures the env var is set only during the test and restored after, unlike direct os.environ assignment.Final Answer:
monkeypatch.setenv('FEATURE_FLAG', 'enabled') -> Option AQuick Check:
Use monkeypatch.setenv for temporary env changes [OK]
- Directly modifying os.environ without monkeypatch
- Using keyword arguments in setenv
- Trying to assign value outside setenv call
Ready to prove it?
Pass the test and this pattern moves unknown
