Skip to content

Commit e4cf4ed

Browse files
committed
Introduce feature directories in tests
This sets up a directory structure where an entire directory gets a feature mark. This makes it easy to skip entire feature tests.
1 parent 99670e3 commit e4cf4ed

22 files changed

Lines changed: 15 additions & 84 deletions

docs/developer/testing.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,10 +259,12 @@ def test_dynflow_service_instances(server, instance):
259259

260260
## Where to add new tests
261261

262+
The directory `tests/feature` is special. Any subdirectory automatically applies the feature marker. `tests/feature/foreman/api_test.py` is equivalent to `tests/foreman_api_test.py` with `pytestmark = pytest.mark.feature("foreman")`.
263+
262264
| What you're testing | File |
263265
| --- | --- |
264-
| A new service (container or systemd unit) | `tests/<service>_test.py` |
265-
| Foreman API behavior | `tests/foreman_api_test.py` (or a new file for larger areas) |
266+
| A new service (container or systemd unit) | `tests/feature/<feature>/<service>_test.py` |
267+
| Foreman API behavior | `tests/feature/foreman/api_test.py` (or a new file for larger areas) |
266268
| Client registration or content workflows | `tests/client_test.py` |
267269
| CLI flags, playbooks, or feature management | `tests/features_test.py` or `tests/playbooks_test.py` |
268270
| A standalone script (no deployment needed) | `tests/unit/<name>_test.py` |

tests/conftest.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,17 @@ def pytest_collection_modifyitems(config, items):
282282
config.hook.pytest_deselected(items=deselected)
283283
items[:] = selected
284284

285+
feature_dir = config.rootdir / 'tests' / 'feature'
286+
for item in items:
287+
try:
288+
rel_path = item.path.relative_to(feature_dir)
289+
except ValueError:
290+
# Not in the features directory
291+
pass
292+
else:
293+
feature = rel_path.parts[0]
294+
item.add_marker(pytest.mark.feature(feature))
295+
285296

286297
def pytest_runtest_setup(item):
287298
feature_markers = set(mark.args[0] for mark in item.iter_markers(name="feature"))

tests/feature/__init__.py

Whitespace-only changes.
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import pytest
22

3-
pytestmark = pytest.mark.feature("iop")
4-
53
IOP_IMAGES = [
64
"iop-kafka",
75
"iop-ingress",
Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
import pytest
2-
3-
pytestmark = pytest.mark.feature("iop")
4-
5-
61
def test_advisor_backend_api_service(server):
72
service = server.service("iop-service-advisor-backend-api")
83
assert service.is_running

tests/iop/test_advisor_frontend.py renamed to tests/feature/iop/test_advisor_frontend.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
import pytest
2-
3-
pytestmark = pytest.mark.feature("iop")
4-
5-
61
def test_advisor_frontend_assets_directory(server):
72
assets_dir = server.file("/var/www/iop/assets/apps/advisor")
83
assert assets_dir.exists

tests/iop/test_cvemap_downloader.py renamed to tests/feature/iop/test_cvemap_downloader.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
import pytest
2-
3-
pytestmark = pytest.mark.feature("iop")
4-
5-
61
def test_cvemap_download_script(server):
72
script = server.file("/usr/local/bin/iop-cvemap-download.sh")
83
assert script.exists
Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
import pytest
2-
3-
pytestmark = pytest.mark.feature("iop")
4-
5-
61
def test_engine_service(server):
72
service = server.service("iop-core-engine")
83
assert service.is_running

0 commit comments

Comments
 (0)