pytest.ini configuration - Build an Automation Script
[pytest]
markers =
smoke: mark a test as a smoke test
addopts = -v
# test_sample.py
import pytest
@pytest.mark.smoke
def test_example():
assert 1 + 1 == 2
# test_pytest_ini.py
import subprocess
import sys
import re
def test_pytest_ini_configuration():
# Run pytest in the current directory without extra args
result = subprocess.run([sys.executable, '-m', 'pytest'], capture_output=True, text=True)
output = result.stdout + result.stderr
# Check verbose output: look for 'test_example' in output and '-v' effect (e.g., test names shown)
assert 'test_example' in output
assert re.search(r'collected \d+ items', output)
# Check no warnings about unknown markers
assert 'PytestUnknownMarkWarning' not in output
assert 'WARNING' not in output or 'smoke' in output
The pytest.ini file sets the smoke marker and adds -v to addopts for verbose output by default.
The test_sample.py file contains a simple test marked with @pytest.mark.smoke.
The automation script test_pytest_ini.py runs pytest as a subprocess without extra arguments to verify the configuration.
It asserts that the test name appears in the output, indicating verbose mode is active.
It also checks that no warnings about unknown markers appear, confirming the marker is recognized.
This approach tests the pytest.ini configuration end-to-end without modifying test runner commands.
Now add a second marker named 'regression' and verify both markers are recognized without warnings
Practice
pytest.ini file in a pytest project?Solution
Step 1: Understand pytest.ini role
Thepytest.inifile is used to configure pytest behavior before running tests.Step 2: Differentiate from other files
Test functions are written in Python files, not inpytest.ini. Dependency installation and report generation are handled elsewhere.Final Answer:
To store configuration settings for pytest test runs -> Option BQuick Check:
pytest.ini = config file [OK]
- Confusing pytest.ini with test script files
- Thinking pytest.ini installs packages
- Assuming pytest.ini generates reports
pytest.ini?Solution
Step 1: Recall pytest verbosity setting
pytest usesaddoptsto pass command-line options like-vvfor verbosity level 2.Step 2: Check syntax correctness
[pytest] addopts = -vv correctly usesaddopts = -vv. [pytest] verbosity = 2 uses an invalid keyverbosity. [pytest] verbosity: 2 uses wrong syntax with colon. [pytest] addopts = --verbosity=2 uses an invalid flag.Final Answer:
[pytest] addopts = -vv -> Option AQuick Check:
Verbosity level 2 via addopts = -vv [OK]
- Using 'verbosity' instead of 'addopts'
- Incorrect syntax with colon instead of equals
- Using unsupported flags like --verbosity
pytest.ini content:[pytest]
markers = slow: marks tests as slow
smoke: marks smoke tests
addopts = -rsWhat will be the effect of running
pytest with this configuration?Solution
Step 1: Understand markers and addopts
Themarkerssection defines labels for tests but does not skip them automatically. Theaddopts = -rsoption tells pytest to show extra summary info for skipped and failed tests.Step 2: Analyze each option
Tests marked as slow or smoke will be skipped automatically is wrong because markers alone don't skip tests. Only tests marked as slow will run is wrong because no selection is made. pytest will run tests with no output is wrong because-rsincreases output detail.Final Answer:
pytest will show extra summary info for skipped and failed tests -> Option DQuick Check:
addopts = -rs shows skip/fail summary [OK]
- Thinking markers skip tests automatically
- Confusing addopts flags with test selection
- Assuming no output with -rs option
pytest.ini file:[pytest] markers = regression addopts = --maxfail=3
But when you run pytest, you get an error:
ERROR: unknown option: --maxfail=3What is the most likely cause?
Solution
Step 1: Understand the error message
The error saysunknown option: --maxfail=3, meaning pytest does not recognize this option.Step 2: Check possible causes
Theaddoptsline should use-maxfail=3instead is wrong because--maxfailrequires two dashes. Thepytest.inifile is missing the[pytest]header is wrong because the header is present. Markers must be defined afteraddoptsinpytest.iniis wrong because order does not matter. The most common cause is an outdated pytest version that lacks support for--maxfail.Final Answer:
The pytest version is outdated and does not support --maxfail -> Option CQuick Check:
Unknown option usually means outdated pytest [OK]
- Changing option syntax incorrectly
- Forgetting to include [pytest] header
- Thinking order of keys matters in pytest.ini
pytest.ini to:1. Mark tests with
slow and critical labels.2. Run only tests matching the pattern
test_*.py.3. Stop after 2 failures.
Which of the following
pytest.ini configurations achieves all three correctly?Solution
Step 1: Check markers syntax
Options A, C, and D correctly define markers with descriptions. [pytest] markers = slow critical python_files = test_*.py addopts = -x --maxfail=2 lacks descriptions, which is allowed but less clear.Step 2: Verify test file pattern
All options setpython_files = test_*.pycorrectly.Step 3: Confirm failure stop and run options
[pytest] markers = slow: slow tests critical: critical tests python_files = test_*.py addopts = --maxfail=2 usesaddopts = --maxfail=2which stops after 2 failures but does not stop immediately on first failure. Options C and D add-xwhich stops after first failure, conflicting with requirement to stop after 2 failures. [pytest] markers = slow critical python_files = test_*.py addopts = -x --maxfail=2 lacks descriptions in markers.Final Answer:
Markers with descriptions, correct python_files, and stop after 2 failures -> Option AQuick Check:
Use --maxfail=2 without -x to stop after 2 failures [OK]
- Adding -x stops after 1 failure, not 2
- Omitting marker descriptions
- Misconfiguring python_files pattern
Ready to prove it?
Pass the test and this pattern moves unknown
