Testing Devices That Share a Computer
A lab usually runs one device server per instrument, several of them on one computer. Their network ports never get in each other’s way, but the instruments behind them share the computer’s USB controller, processor and disk, and a test of one device at a time cannot see that.
ConcurrentFieldTest, in plesty.lib.test.field_test_concurrency, runs checks from
Testing on the Instrument on each device alone, then on all of
them at once, and compares how long each command took. A command that slows down
only while its neighbours are busy points at something the devices share, not at the
device module.
from plesty.lib.test.field_test import FieldTestPipeline
from plesty.lib.test.field_test_concurrency import ConcurrentFieldTest
comparison = ConcurrentFieldTest(
{
"rotator": FieldTestPipeline(K10CR1, "COM3", repetitions=50),
"powermeter": FieldTestPipeline(PM100D, "USB0::0x1313::0x8078::P1::INSTR", repetitions=50),
},
tolerance=0.10,
report_path="reports/concurrency-labhost",
).run()
raise SystemExit(0 if comparison.ok else 1)
For each device and command, the comparison reports the median and 95th-percentile
time alone and together, their ratio, and how often the command failed in each case.
A command counts as slowed down when its median grows by more than tolerance (10 %
here), or when it fails only when the others are running.
overlap_fraction says how much of the “together” phase really had every device
running at once. A low value means the devices hardly overlapped, and the comparison
understates the problem: give each pipeline enough repetitions that it runs for
several seconds alone.
Argument |
Default |
Meaning |
|---|---|---|
the pipelines |
one |
|
|
|
which checks to run alone and together |
|
|
how much slower, as a fraction, a command may get together |
|
|
pause between the “alone” runs and the “together” run |
|
|
where to write the comparison |