В одной из моих тестовых функций у меня есть следующий фрагмент кода:
for key, expected_value in tools.config['expected_values']['devices']['specs'][device_spec].items():
if expected_value > 0:
try:
value = data[device_spec][key]
assert expected_value == value, pytest.fail('ERROR: Missing device using {}: {}.\nDetected: {}. Expected: {}\nEndpoint: {}'.format(device_spec, key, value, expected_value, endpoint), pytrace=False)
except KeyError:
pytest.fail('ERROR: There are no clients using {}: {}\nExpected: {}\nEndpoint: {}'.format(device_spec, key, expected_value, endpoint), pytrace=False)
raise SystemExit(1)
Может произойти сбой по двум причинам:
- Поскольку не существует ожидаемого количества устройств, использующих некоторые ожидаемые спецификации (например, обнаружено 4 Linux, но ожидается 7).
- Поскольку устройства вообще не используют определенную спецификацию (например, нет устройства Windows).
Дело в том, что во время выполнения теста могут выполняться оба условия. Например, конфигурация может быть:
expected_values:
devices:
specs:
operating_systems:
LINUX: 1
MACOS: 2
WINDOWS: 0
ANDROID: 1
IOS: 1
И предположим, что есть только 1 устройство MacOS, а устройств Android нет. Выход должен быть:
ERROR: Missing device using operating_system: MACOS.
Detected: 1. Expected: 2
Endpoint: example.com/api/operating_system
ERROR: There are no clients using operating_system: Android.
Expected: 1.
Endpoint: example.com/api/operating_system
Фактически, если я добавлю print(key)
, я могу подтвердить, что отображается LINUX, MACOS, и после этого код останавливается. Он не прочитал другие ключи.
Однако отображается только первый, и я предполагаю, что pytest.fail
ломает for
. Итак, как я могу предотвратить эту ситуацию?