Skip to content

Commit 195ac33

Browse files
authored
Test niscope fetching more thoroughly and consistently, parameterize channels tested (#1956)
* test fetching more thoroughly and consistently, parameterize channels tested * tweak tests to pass * remove duplicate assertion * Fix flake8 issues in tests
1 parent ca585de commit 195ac33

File tree

1 file changed

+132
-57
lines changed

1 file changed

+132
-57
lines changed

src/niscope/system_tests/test_system_niscope.py

Lines changed: 132 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@
1919

2020
instruments = ['FakeDevice1', 'FakeDevice2']
2121
# TODO(sbethur): Use `get_channel_names` when #1402 is fixed
22-
test_channels = 'FakeDevice2/0,FakeDevice1/1'
22+
test_channels_1 = 'FakeDevice2/0,FakeDevice1/1'
23+
test_channels_1_expanded = test_channels_1
24+
# TODO(jfitzger): Use the commented values, once #1770 is fixed
25+
test_channels_2 = 'FakeDevice2/0' # 'FakeDevice2/0:1'
26+
test_channels_2_expanded = 'FakeDevice2/0' # 'FakeDevice2/0,FakeDevice2/1'
2327

2428

2529
# There are system tests below that need either a PXI-5124 or a PXI-5142 instead of the PXIe-5164 we use everywhere else
@@ -37,6 +41,33 @@
3741
daqmx_sim_5142_lock = fasteners.InterProcessLock(daqmx_sim_5142_lock_file)
3842

3943

44+
def check_fetched_data(
45+
data, # either waveforms or measurement_stats
46+
test_channels_expanded,
47+
test_record_length,
48+
test_num_records_to_fetch,
49+
test_starting_record_number=0
50+
):
51+
test_num_channels = len(test_channels_expanded.split(','))
52+
53+
# Ordering: rec 0: ch 0, rec 0: ch 1, rec 1: ch 0, rec 1: ch 1, etc.
54+
expected_channels = test_channels_expanded.split(',') * test_num_records_to_fetch
55+
expected_records = []
56+
for i in range(test_starting_record_number, test_starting_record_number + test_num_records_to_fetch):
57+
expected_records += [i] * test_num_channels
58+
59+
assert len(data) == test_num_channels * test_num_records_to_fetch
60+
for i in range(len(data)):
61+
if isinstance(data[i], niscope.WaveformInfo):
62+
assert len(data[i].samples) == test_record_length
63+
elif isinstance(data[i], niscope.MeasurementStats):
64+
assert data[i].result == 0.0
65+
else:
66+
raise TypeError(f"data is unsupported type {type(data[i])}")
67+
assert data[i].channel == expected_channels[i]
68+
assert data[i].record == expected_records[i]
69+
70+
4071
class SystemTests:
4172
@pytest.fixture(scope='function')
4273
def single_instrument_session(self, session_creation_kwargs):
@@ -72,22 +103,32 @@ def test_vi_string_attribute(self, multi_instrument_session):
72103
assert trigger_source == multi_instrument_session.acq_arm_source
73104

74105
# Basic usability tests
75-
def test_read(self, multi_instrument_session):
106+
@pytest.mark.parametrize(
107+
"test_channels,test_channels_expanded",
108+
[
109+
(test_channels_1, test_channels_1_expanded),
110+
(test_channels_2, test_channels_2_expanded),
111+
],
112+
)
113+
def test_read(self, multi_instrument_session, test_channels, test_channels_expanded):
76114
test_voltage = 1.0
77115
test_record_length = 2000
78-
test_num_channels = 2
79116
test_num_records = 3
80117
multi_instrument_session.configure_vertical(test_voltage, niscope.VerticalCoupling.AC)
81118
multi_instrument_session.configure_horizontal_timing(50000000, test_record_length, 50.0, test_num_records, True)
82119
waveforms = multi_instrument_session.channels[test_channels].read(num_samples=test_record_length, num_records=test_num_records)
83-
assert len(waveforms) == test_num_channels * test_num_records
84-
for i in range(len(waveforms)):
85-
assert len(waveforms[i].samples) == test_record_length
120+
check_fetched_data(waveforms, test_channels_expanded, test_record_length, test_num_records)
86121

87-
def test_fetch(self, multi_instrument_session):
122+
@pytest.mark.parametrize(
123+
"test_channels,test_channels_expanded",
124+
[
125+
(test_channels_1, test_channels_1_expanded),
126+
(test_channels_2, test_channels_2_expanded),
127+
],
128+
)
129+
def test_fetch(self, multi_instrument_session, test_channels, test_channels_expanded):
88130
test_voltage = 1.0
89131
test_record_length = 2000
90-
test_num_channels = 2
91132
test_starting_record_number = 2
92133
test_num_records_to_acquire = 5
93134
test_num_records_to_fetch = test_num_records_to_acquire - test_starting_record_number
@@ -98,13 +139,13 @@ def test_fetch(self, multi_instrument_session):
98139
num_samples=test_record_length,
99140
record_number=test_starting_record_number,
100141
num_records=test_num_records_to_fetch)
101-
assert len(waveforms) == test_num_channels * test_num_records_to_fetch
102-
expected_channels = test_channels.split(',') * test_num_records_to_fetch
103-
expected_records = [2, 2, 3, 3, 4, 4]
104-
for i in range(len(waveforms)):
105-
assert len(waveforms[i].samples) == test_record_length
106-
assert waveforms[i].channel == expected_channels[i]
107-
assert waveforms[i].record == expected_records[i]
142+
check_fetched_data(
143+
waveforms,
144+
test_channels_expanded,
145+
test_record_length,
146+
test_num_records_to_fetch,
147+
test_starting_record_number,
148+
)
108149

109150
def test_fetch_defaults(self, multi_instrument_session):
110151
test_voltage = 1.0
@@ -113,7 +154,7 @@ def test_fetch_defaults(self, multi_instrument_session):
113154
multi_instrument_session.configure_vertical(test_voltage, niscope.VerticalCoupling.AC)
114155
multi_instrument_session.configure_horizontal_timing(50000000, test_record_length, 50.0, 1, True)
115156
with multi_instrument_session.initiate():
116-
waveforms = multi_instrument_session.channels[test_channels].fetch()
157+
waveforms = multi_instrument_session.channels[test_channels_1].fetch()
117158
assert len(waveforms) == test_num_channels
118159
for i in range(len(waveforms)):
119160
assert len(waveforms[i].samples) == test_record_length
@@ -123,10 +164,22 @@ def measurement_wfm_length(self, request):
123164
MeasWfmLength = collections.namedtuple('MeasurementWaveformLength', ['passed_in', 'expected'])
124165
return MeasWfmLength(passed_in=request.param[0], expected=request.param[1])
125166

126-
def test_fetch_array_measurement(self, multi_instrument_session, measurement_wfm_length):
167+
@pytest.mark.parametrize(
168+
"test_channels,test_channels_expanded",
169+
[
170+
(test_channels_1, test_channels_1_expanded),
171+
(test_channels_2, test_channels_2_expanded),
172+
],
173+
)
174+
def test_fetch_array_measurement(
175+
self,
176+
multi_instrument_session,
177+
measurement_wfm_length,
178+
test_channels,
179+
test_channels_expanded,
180+
):
127181
test_voltage = 1.0
128182
test_record_length = 1000
129-
test_num_channels = 2
130183
test_meas_wfm_length = measurement_wfm_length.passed_in
131184
test_array_meas_function = niscope.ArrayMeasurement.ARRAY_GAIN
132185
test_starting_record_number = 2
@@ -146,13 +199,13 @@ def test_fetch_array_measurement(self, multi_instrument_session, measurement_wfm
146199
meas_num_samples=2000,
147200
timeout=hightime.timedelta(seconds=4))
148201

149-
assert len(waveforms) == test_num_channels * test_num_records_to_fetch
150-
expected_channels = test_channels.split(',') * test_num_records_to_fetch
151-
expected_records = [2, 2, 3, 3, 4, 4]
152-
for i in range(len(waveforms)):
153-
assert len(waveforms[i].samples) == measurement_wfm_length.expected
154-
assert waveforms[i].channel == expected_channels[i]
155-
assert waveforms[i].record == expected_records[i]
202+
check_fetched_data(
203+
waveforms,
204+
test_channels_expanded,
205+
measurement_wfm_length.expected,
206+
test_num_records_to_fetch,
207+
test_starting_record_number,
208+
)
156209

157210
def test_fetch_array_measurement_defaults(self, multi_instrument_session):
158211
test_voltage = 1.0
@@ -165,18 +218,28 @@ def test_fetch_array_measurement_defaults(self, multi_instrument_session):
165218
multi_instrument_session.configure_horizontal_timing(50000000, test_record_length, 50.0, test_num_records, True)
166219

167220
with multi_instrument_session.initiate():
168-
waveforms = multi_instrument_session.channels[test_channels].fetch_array_measurement(
221+
waveforms = multi_instrument_session.channels[test_channels_1].fetch_array_measurement(
169222
array_meas_function=test_array_meas_function)
170223

171224
assert len(waveforms) == test_num_channels * test_num_records
172225
for i in range(len(waveforms)):
173226
assert len(waveforms[i].samples) == test_record_length
174227

175-
def test_fetch_measurement_stats(self, multi_instrument_session):
228+
@pytest.mark.parametrize(
229+
"test_channels,test_channels_expanded",
230+
[
231+
(test_channels_1, test_channels_1_expanded),
232+
(test_channels_2, test_channels_2_expanded),
233+
],
234+
)
235+
def test_fetch_measurement_stats(
236+
self,
237+
multi_instrument_session,
238+
test_channels,
239+
test_channels_expanded,
240+
):
176241
test_voltage = 1.0
177242
test_record_length = 1000
178-
test_num_channels = 2
179-
test_num_records = 3
180243
test_starting_record_number = 2
181244
test_num_records_to_acquire = 5
182245
test_num_records_to_fetch = test_num_records_to_acquire - test_starting_record_number
@@ -191,13 +254,13 @@ def test_fetch_measurement_stats(self, multi_instrument_session):
191254
num_records=test_num_records_to_fetch,
192255
timeout=hightime.timedelta(seconds=4))
193256

194-
assert len(measurement_stats) == test_num_channels * test_num_records
195-
expected_channels = test_channels.split(',') * test_num_records_to_fetch
196-
expected_records = [2, 2, 3, 3, 4, 4]
197-
for i in range(len(measurement_stats)):
198-
assert measurement_stats[i].result == 0.0
199-
assert measurement_stats[i].channel == expected_channels[i]
200-
assert measurement_stats[i].record == expected_records[i]
257+
check_fetched_data(
258+
measurement_stats,
259+
test_channels_expanded,
260+
None, # pass None for test_record_length, because we shouldn't need it
261+
test_num_records_to_fetch,
262+
test_starting_record_number
263+
)
201264

202265
def test_fetch_measurement_stats_defaults(self, multi_instrument_session):
203266
test_voltage = 1.0
@@ -207,7 +270,7 @@ def test_fetch_measurement_stats_defaults(self, multi_instrument_session):
207270
multi_instrument_session.configure_vertical(test_voltage, niscope.VerticalCoupling.AC)
208271
multi_instrument_session.configure_horizontal_timing(50000000, test_record_length, 50.0, test_num_records, True)
209272
with multi_instrument_session.initiate():
210-
measurement_stats = multi_instrument_session.channels[test_channels].fetch_measurement_stats(niscope.enums.ScalarMeasurement.NO_MEASUREMENT)
273+
measurement_stats = multi_instrument_session.channels[test_channels_1].fetch_measurement_stats(niscope.enums.ScalarMeasurement.NO_MEASUREMENT)
211274

212275
assert len(measurement_stats) == test_num_channels * test_num_records
213276
for stat in measurement_stats:
@@ -220,10 +283,10 @@ def test_clear_waveform_measurement_stats(self, multi_instrument_session):
220283
multi_instrument_session.configure_vertical(test_voltage, niscope.VerticalCoupling.AC)
221284
multi_instrument_session.configure_horizontal_timing(50000000, test_record_length, 50.0, test_num_records, True)
222285
with multi_instrument_session.initiate():
223-
uncleared_stats = multi_instrument_session.channels[test_channels].fetch_measurement_stats(niscope.enums.ScalarMeasurement.FREQUENCY)
224-
uncleared_stats_2 = multi_instrument_session.channels[test_channels].fetch_measurement_stats(niscope.enums.ScalarMeasurement.FREQUENCY)
225-
multi_instrument_session.channels[test_channels].clear_waveform_measurement_stats(niscope.enums.ClearableMeasurement.FREQUENCY)
226-
cleared_stats = multi_instrument_session.channels[test_channels].fetch_measurement_stats(niscope.enums.ScalarMeasurement.FREQUENCY)
286+
uncleared_stats = multi_instrument_session.channels[test_channels_1].fetch_measurement_stats(niscope.enums.ScalarMeasurement.FREQUENCY)
287+
uncleared_stats_2 = multi_instrument_session.channels[test_channels_1].fetch_measurement_stats(niscope.enums.ScalarMeasurement.FREQUENCY)
288+
multi_instrument_session.channels[test_channels_1].clear_waveform_measurement_stats(niscope.enums.ClearableMeasurement.FREQUENCY)
289+
cleared_stats = multi_instrument_session.channels[test_channels_1].fetch_measurement_stats(niscope.enums.ScalarMeasurement.FREQUENCY)
227290

228291
# The principle here is using consistent behavior (i.e. if stats are fetched twice on a single record/channel measurement in a row, it will always be the same)
229292
# to demonstrate that clearing the stats does in fact cause a measurable change.
@@ -244,9 +307,9 @@ def test_waveform_processing(self, multi_instrument_session):
244307
multi_instrument_session.configure_horizontal_timing(50000000, test_record_length, 50.0, test_num_records, True)
245308
with multi_instrument_session.initiate():
246309
multi_instrument_session.add_waveform_processing(niscope.enums.ArrayMeasurement.DERIVATIVE)
247-
processed_waveforms = multi_instrument_session.channels[test_channels].fetch_measurement_stats(niscope.enums.ScalarMeasurement.MID_REF_VOLTS)
310+
processed_waveforms = multi_instrument_session.channels[test_channels_1].fetch_measurement_stats(niscope.enums.ScalarMeasurement.MID_REF_VOLTS)
248311
multi_instrument_session.clear_waveform_processing()
249-
unprocessed_waveforms = multi_instrument_session.channels[test_channels].fetch_measurement_stats(niscope.enums.ScalarMeasurement.MID_REF_VOLTS)
312+
unprocessed_waveforms = multi_instrument_session.channels[test_channels_1].fetch_measurement_stats(niscope.enums.ScalarMeasurement.MID_REF_VOLTS)
250313

251314
assert len(processed_waveforms) == test_num_channels * test_num_records
252315
assert len(unprocessed_waveforms) == test_num_channels * test_num_records
@@ -264,7 +327,7 @@ def test_measurement_stats_str(self, multi_instrument_session):
264327
multi_instrument_session.configure_vertical(test_voltage, niscope.VerticalCoupling.AC)
265328
multi_instrument_session.configure_horizontal_timing(50000000, test_record_length, 50.0, test_num_records, True)
266329
with multi_instrument_session.initiate():
267-
measurement_stat = multi_instrument_session.channels[test_channels].fetch_measurement_stats(niscope.enums.ScalarMeasurement.NO_MEASUREMENT)
330+
measurement_stat = multi_instrument_session.channels[test_channels_1].fetch_measurement_stats(niscope.enums.ScalarMeasurement.NO_MEASUREMENT)
268331

269332
assert isinstance(measurement_stat[0].__str__(), str)
270333
assert isinstance(measurement_stat[0].__repr__(), str)
@@ -457,18 +520,29 @@ def session_creation_kwargs(self):
457520

458521
# not supported by grpc due to numpy usage
459522
@pytest.mark.parametrize(
460-
"fetch_waveform_type,type_min_value",
523+
"fetch_waveform_type,type_min_value,test_channels,test_channels_expanded",
461524
[
462-
(numpy.int8, numpy.iinfo(numpy.int8).min),
463-
(numpy.int16, numpy.iinfo(numpy.int16).min),
464-
(numpy.int32, numpy.iinfo(numpy.int32).min),
465-
(numpy.float64, numpy.finfo(numpy.float64).min),
525+
(numpy.int8, numpy.iinfo(numpy.int8).min, test_channels_1, test_channels_1_expanded),
526+
(numpy.int16, numpy.iinfo(numpy.int16).min, test_channels_1, test_channels_1_expanded),
527+
(numpy.int32, numpy.iinfo(numpy.int32).min, test_channels_1, test_channels_1_expanded),
528+
(numpy.float64, numpy.finfo(numpy.float64).min, test_channels_1, test_channels_1_expanded),
529+
(numpy.int8, numpy.iinfo(numpy.int8).min, test_channels_2, test_channels_2_expanded),
530+
(numpy.int16, numpy.iinfo(numpy.int16).min, test_channels_2, test_channels_2_expanded),
531+
(numpy.int32, numpy.iinfo(numpy.int32).min, test_channels_2, test_channels_2_expanded),
532+
(numpy.float64, numpy.finfo(numpy.float64).min, test_channels_2, test_channels_2_expanded),
466533
],
467534
)
468-
def test_fetch_into(self, multi_instrument_session, fetch_waveform_type, type_min_value):
535+
def test_fetch_into(
536+
self,
537+
multi_instrument_session,
538+
fetch_waveform_type,
539+
type_min_value,
540+
test_channels,
541+
test_channels_expanded,
542+
):
469543
test_voltage = 1.0
470544
test_record_length = 2000
471-
test_num_channels = 2
545+
test_num_channels = len(test_channels_expanded.split(','))
472546
test_starting_record_number = 2
473547
test_num_records_to_acquire = 5
474548
test_num_records_to_fetch = test_num_records_to_acquire - test_starting_record_number
@@ -486,17 +560,18 @@ def test_fetch_into(self, multi_instrument_session, fetch_waveform_type, type_mi
486560

487561
for index, sample in enumerate(waveform):
488562
assert sample != init_waveform[index]
489-
assert len(waveforms) == test_num_channels * test_num_records_to_fetch
490563

491-
expected_channels = test_channels.split(',') * test_num_records_to_fetch
492-
expected_records = [2, 2, 3, 3, 4, 4]
564+
check_fetched_data(
565+
waveforms,
566+
test_channels_expanded,
567+
test_record_length,
568+
test_num_records_to_fetch,
569+
test_starting_record_number,
570+
)
493571
for i in range(len(waveforms)):
494572
record_wfm = waveforms[i].samples
495-
assert len(record_wfm) == test_record_length
496573
for j in range(len(record_wfm)):
497574
assert record_wfm[j] == waveform[i * test_record_length + j]
498-
assert waveforms[i].channel == expected_channels[i]
499-
assert waveforms[i].record == expected_records[i]
500575

501576
def test_configure_ref_levels(self, single_instrument_session):
502577
single_instrument_session._configure_ref_levels()

0 commit comments

Comments
 (0)