# Testing a Viewer A plot is an ordinary function or object: it takes the run's data and returns drawables (see [Plots and Drawables](../viewing/plots.md)). So it can be tested without a window, a screen or the `gui` extra, by giving it the data of a stored run and checking what it returns. ```python # tests/test_viz.py from plesty.lib.monitor import Line, RunData from power_viz import power # the plot function of the viewer being tested def test_power_draws_one_point_per_step(): data = RunData("tests/runs/powerscan_20260925-101534") data.poll() # read the rows saved so far drawing = power(data) assert len(drawing) == 1 assert isinstance(drawing[0], Line) assert list(drawing[0].x) == [500.0, 550.0, 600.0, 650.0, 700.0] ``` - `RunData(run_folder)` reads nothing yet; `poll()` reads every row saved so far and returns how many it read. In a viewer, `Viz` does this at each refresh. - `@viz.plot` returns the function unchanged, so the test calls `power(data)` directly. For a `Plot` object, call `plot.draw(data)`. - Keep a small finished run in the module's tests, made by running the experiment once on its simulated devices, so the test does not depend on a lab computer. A viewer's `reads=` function can be tested the same way: call it with a row and a `Run`, and check the fields it returns.