Testing#
Estimated reading time: 3 minutes
The tests tree mirrors the src/tephpy package layout: tests for top-level modules
live at the tests/ root, and every subpackage has a matching directory —
tests/plotting/ for tephpy.plotting — however few modules it carries.
tephpy.samples is a lone __init__.py and still has tests/samples/.
tests/test_layout.py holds the tree to that, so a subpackage arriving without its
directory fails a test rather than waiting to be noticed. Place a new test module at the
level of the module it exercises; the shared fixtures/ and baseline/ directories
stay at the root.
Running the Suite#
$ pixi run tests
pytest runs with a strict configuration and filterwarnings = ["error"], so a warning
is a failure. pixi run tests-clean removes the artifacts a run leaves behind.
Image Comparison#
Plotting tests compare a rendered figure against a recorded baseline with pytest-mpl,
marked @pytest.mark.mpl_image_compare. Both CI and pixi run tests pass --mpl,
so the comparison is enforced rather than skipped.
$ pixi run baselines
regenerates tests/baseline. Reach for it when a lockfile bump moves
matplotlib or freetype, and re-verify across all three test environments afterwards — the baselines are
shared, and a regeneration that satisfies one Python can fail another.
Tip
A failed comparison is far easier to read as a report than as a diff of two numbers. pytest-mpl writes one on request:
$ pixi run tests --mpl-generate-summary=html --mpl-results-path=mpl-results
The report puts the baseline, the render and their difference side by side for
every failure, which usually says at a glance whether a change is a real
regression or a font moving underneath it. json and basic-html are the
other supported forms.
No Test Touches the Network#
The ingest readers are tested against recorded captures under tests/fixtures/io/,
byte-faithful and with their provenance recorded beside them. Nothing in the suite makes a
request.
The reason is worth stating, because the rule costs something. A suite that reached the
University of Wyoming would fail on their outage rather than on a defect here, and a red
tick that means “somebody else is down” teaches a reader to ignore red ticks. What the rule
gives up is knowing when the archive moves under us — every gate stays green while
tephpy.io.wyoming stops working. Continuous Integration describes the scheduled job that pays that
cost instead.