大海捞针(Python)
我有一个功能,用于在应用程序的搜索功能中查找错误,这是非常有用的。在这个函数上运行pytest迭代,提交用于搜索的随机UTF-8字符串大约每500次搜索生成一次调试错误 由于我可以获取导致错误的每个字符串,所以我想确定这些字符串中真正引起错误的最小字符子序列是什么。换句话说,(在pytest循环中): 我是否应该将字符串切成两半,并将每一面都削短,然后重新提交,直到失败,然后从其(len()-1)中选择随机字符,如果没有发生错误,则进行备份?蛮力组合?最好的办法是什么大海捞针(Python),python,pytest,Python,Pytest,我有一个功能,用于在应用程序的搜索功能中查找错误,这是非常有用的。在这个函数上运行pytest迭代,提交用于搜索的随机UTF-8字符串大约每500次搜索生成一次调试错误 由于我可以获取导致错误的每个字符串,所以我想确定这些字符串中真正引起错误的最小字符子序列是什么。换句话说,(在pytest循环中): 我是否应该将字符串切成两半,并将每一面都削短,然后重新提交,直到失败,然后从其(len()-1)中选择随机字符,如果没有发生错误,则进行备份?蛮力组合?最好的办法是什么 谢谢。 如果有两个字符序列
谢谢。 如果有两个字符序列导致失败,则将字符串拆分为一半将失败,并且该序列正好位于中间。每一半都成功,但组合字符串失败 这里有一个算法可以找到局部最小值: 尝试依次删除每个字符
- 如果删除字符仍然会导致失败,请保留新的较短字符串,并在此新字符串上重复算法
- 如果删除字符不再导致失败,请将其放回原处,然后尝试删除下一个字符。继续,直到没有更多的字符可以尝试。当到达字符串末尾时,您知道删除任何一个字符都会导致搜索成功
希望有帮助 首先,值得注意的是,解决方案可能不是唯一的,即可能存在两个或多个断开的子字符串
另一个建议(对于Xavier和Mark的正确答案)是运行递归方法。对导致错误的有限字符串子集重复采样。一旦发现另一个错误,重复此操作,直到达到最小的子字符串。这种方法足够健壮,可以处理更复杂的用例,其中错误可能存在于两个不相邻的条目中。我不认为这里是这种情况,但是有一个通用的purpose方法很好。我说“理论上”最小,因为它不能保证。假设
*A.*B.*
格式的所有字符串都会导致错误。因此,给定abcAdefBghi
,此方法将找到AdefB
,而不是真正最小的AB
。但至少你知道触发器在最左边和最右边。今天就实现了。效果很好。谢谢
def fumble_towards_ecstasy(string_that_breaks):
# iterate over both length and content of the string
nugget = # minimum series of characters that break the search
return nugget