在我的测试功能之一中,我具有以下代码:
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)
它可能由于两个不同的原因而失败:
问题是在测试运行期间,两个条件都可能同时满足。例如,配置可能是:
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
。那么,如何预防这种情况?
答案 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
来重构该代码。