干草堆中的可变长度针(Python)



我有一个函数,旨在查找应用程序搜索功能中的错误,它根据非控制UTF-8的可能性生成可变长度的搜索字符串。在这个函数上运行pytest迭代,提交搜索的随机UTF-8字符串大约每500次搜索就会产生一次调试错误。

由于我可以获取导致错误的每个字符串,所以我想确定这些字符串中真正引发错误的字符的最小子序列是什么。换句话说,(pytest循环内部):

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

我应该把字符串切成两半,每一边都削一削,然后重新提交直到失败,从它的(len()-1)中选择随机字符,然后在没有发生错误的情况下备份吗?组合力?最好的方法是什么?

谢谢。

如果有两个字符的序列导致失败,并且该序列正好位于在中间,则将字符串一分为二将失败。每一半成功,但组合字符串失败。

这里有一种算法可以找到局部最小值:

尝试依次删除每个字符。

  • 如果删除字符仍然导致失败,请保留新的较短字符串,并在此新字符串上重复算法
  • 如果删除该字符不再导致失败,请将其放回原处,然后尝试删除下一个字符。继续,直到没有更多的字符可供尝试。当您到达字符串的末尾时,您知道删除任何一个字符都会导致搜索成功

我会使用"两边都削"的方法。拆分字符串将始终存在拆分导致错误的子字符串的风险。我的方法是:

  1. 在确保字符串导致错误的同时,尽可能多地从字符串左侧弹出字符
  2. 对右侧执行相同操作
  3. 理论上,您只剩下导致错误的最小子字符串

希望能有所帮助!

首先值得注意的是,该解决方案可能不是唯一的,即可能存在两个或多个断开的子字符串。

另一个建议(对于Xavier和Mark的好答案)是运行递归方法。对导致错误的有限字符串子集重复采样。一旦发现另一个错误,重复此操作,直到达到最小子字符串。这种方法足够健壮,可以处理更复杂的用例,其中错误可能存在于两个不相邻的条目中。我不认为这里是这样的,但有一个通用的目的方法是很好的。

最新更新