Как предотвратить разрыв этой петли? - PullRequest
0 голосов
/ 27 июня 2018

В одной из моих тестовых функций у меня есть следующий фрагмент кода:

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)

Может произойти сбой по двум причинам:

  1. Поскольку не существует ожидаемого количества устройств, использующих некоторые ожидаемые спецификации (например, обнаружено 4 Linux, но ожидается 7).
  2. Поскольку устройства вообще не используют определенную спецификацию (например, нет устройства 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. Итак, как я могу предотвратить эту ситуацию?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Хорошо, я нашел, почему это не работает, как ожидалось. Проблема в том, что pytest.fail я подозревал. Когда вызывается pytest.fail, он не проходит весь тест, поэтому после него код не выполняется.

Итак, pytest.fail не нарушает цикл for, а pytest.fail нарушает всю тестовую функцию. Поэтому мне нужно будет провести рефакторинг этого кода, не используя pytest.fail на этом этапе.

0 голосов
/ 27 июня 2018
  except KeyError:
            pytest.fail('ERROR: There are no clients using {}: {}\nExpected: {}\nEndpoint: {}'.format(device_spec, key, expected_value, endpoint), pytrace=False)
            raise SystemExit(1)

SystemExit (1) является основной причиной прерывания цикла, которое вызывает принудительное завершение программы. просто удалив его из кода будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...