Skip to content

Commit 792158f

Browse files
committed
ci: prepare regression datasets before test execution and verify immutability
1 parent e068296 commit 792158f

3 files changed

Lines changed: 69 additions & 16 deletions

File tree

.github/workflows/pr.yaml

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -110,37 +110,39 @@ jobs:
110110
shell: bash
111111
run: |
112112
rm -rf .pytest_cache
113-
rm -rf .testdata
114113
find . -type d -name "__pycache__" -prune -exec rm -rf {} +
115114
116-
- name: Snapshot regression test data before tests
115+
- name: Prepare regression test data
117116
shell: bash
118117
run: |
119-
if [ -d .testdata ]; then
120-
find .testdata -type f -exec sha256sum {} \; | sort > testdata.before.sha256
121-
else
122-
touch testdata.before.sha256
118+
python -m tests.regression.prepare_testdata --system "${{ matrix.system }}"
119+
120+
if [ ! -d .testdata ]; then
121+
echo ".testdata was not created"
122+
exit 1
123123
fi
124124
125+
- name: Snapshot regression test data before tests
126+
shell: bash
127+
run: |
128+
find .testdata -type f -exec sha256sum {} \; | sort > testdata.before.sha256
129+
125130
- name: Run fast regression tests (per system)
126131
run: |
127132
python -m pytest tests/regression \
128133
-m "not slow" \
129134
--cache-clear \
130135
-n 1 \
131-
-k "${{ matrix.system }}" \
136+
--system "${{ matrix.system }}" \
132137
-vv \
133-
--durations=20
138+
--durations=20 \
139+
--codeentropy-debug
134140
135141
- name: Snapshot regression test data after tests
136142
if: always()
137143
shell: bash
138144
run: |
139-
if [ -d .testdata ]; then
140-
find .testdata -type f -exec sha256sum {} \; | sort > testdata.after.sha256
141-
else
142-
touch testdata.after.sha256
143-
fi
145+
find .testdata -type f -exec sha256sum {} \; | sort > testdata.after.sha256
144146
145147
- name: Check regression test data did not change
146148
if: always()

tests/regression/conftest.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from __future__ import annotations
22

3-
import os
43
import random
54

65
import numpy as np
@@ -48,8 +47,6 @@ def pytest_configure(config: pytest.Config) -> None:
4847
random.seed(seed)
4948
np.random.seed(seed)
5049

51-
os.environ["PYTHONHASHSEED"] = "0"
52-
5350

5451
def pytest_collection_modifyitems(
5552
config: pytest.Config, items: list[pytest.Item]
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from __future__ import annotations
2+
3+
import argparse
4+
from pathlib import Path
5+
6+
import yaml
7+
8+
from tests.regression.cases import discover_cases
9+
from tests.regression.helpers import (
10+
_abspathify_config_paths,
11+
ensure_testdata_for_system,
12+
)
13+
14+
15+
def required_paths_for_case(case) -> list[Path]:
16+
raw = yaml.safe_load(case.config_path.read_text())
17+
cooked = _abspathify_config_paths(raw, base_dir=case.config_path.parent)
18+
19+
required: list[Path] = []
20+
run1 = cooked.get("run1")
21+
22+
if isinstance(run1, dict):
23+
ff = run1.get("force_file")
24+
if isinstance(ff, str) and ff:
25+
required.append(Path(ff))
26+
27+
for p in run1.get("top_traj_file") or []:
28+
if isinstance(p, str) and p:
29+
required.append(Path(p))
30+
31+
return required
32+
33+
34+
def main() -> None:
35+
parser = argparse.ArgumentParser()
36+
parser.add_argument("--system", action="append", default=None)
37+
args = parser.parse_args()
38+
39+
selected = set(args.system or [])
40+
cases = discover_cases()
41+
42+
for case in cases:
43+
if selected and case.system not in selected:
44+
continue
45+
46+
required = required_paths_for_case(case)
47+
if required:
48+
ensure_testdata_for_system(case.system, required_paths=required)
49+
50+
print("Regression test data prepared.")
51+
52+
53+
if __name__ == "__main__":
54+
main()

0 commit comments

Comments
 (0)