gpt4 book ai didi

python - 断言pytest中没有无限循环

转载 作者:太空宇宙 更新时间:2023-11-04 09:45:34 25 4
gpt4 key购买 nike

我有一个不应该挂起的函数。具体来说,它检测会导致它挂起的条件并引发错误。简化一下,我的功能和这个差不多:

def chew_repeated_leading_characters(string: str, leader: str):
if len(leader) == 0:
# Without this, will hang on empty string
raise ValueError('leader cannot be empty')

while True:
if string.startswith(leader):
string = string[len(leader):]
else:
break

return string

我想在 pytest 中编写单元测试以确保此行为。我知道如何断言测试应该引发异常。但是,在这种情况下,如果测试失败,实际上并没有失败;整个测试设备只是挂起。

如何在无限循环中生成测试失败?

最佳答案

这样的断言不存在。 “无无限循环”断言将是 Halting Problem 的解决方案, 这被证明没有。

您应该改为检查 raise 子句之后的事件是否发生,如果发生则失败。如果您的函数在该 raise 子句之后使用副作用,最好检查该副作用,而不是向测试添加任意超时。

例如这个方法:

def method(self, should_loop=False):
if should_loop:
raise Exception("You really want me to loop forever?")
while should_loop:
self.side_effect()

可以通过模拟 side_effect() 进行测试,并使其在调用时触发失败。

超时应作为最后的解决方案。


编辑:关于您的代码,很容易在没有超时的情况下执行此操作 - 传递模拟的 string,在调用 startswith() 时触发失败>:

from mock import Mock

...

string_mock = Mock()
string.startswith.side_effect = AssertionError('This will hang.')
leader_mock = Mock()
leader.__len__ = lambda self: 0
chew_repeated_leading_characters(string_mock, leader_mock)

关于python - 断言pytest中没有无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49978657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com