如何防止这种循环中断?

时间:2018-06-27 07:55:36

标签: python python-3.x pytest

在我的测试功能之一中,我具有以下代码:

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 :(得分:0)

  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)是循环中断的主要原因,这导致强制终止程序。只需将其从代码中删除即可。

答案 1 :(得分:0)

好的,我发现了为什么它不能按预期工作。问题是我怀疑的pytest.fail。调用pytest.fail时,它将使整个测试失败,因此之后没有执行任何代码。

因此,不是pytest.fail打破了for循环,不是pytest.fail打破了整个测试功能。因此,我将需要在此时不使用pytest.fail来重构该代码。