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

时间:2012-08-25 23:42:54

标签: python pytest

我有一个功能,旨在查找应用程序搜索功能中的错误,generates a variable-length search string from the non-control UTF-8 possibilities。在此函数上运行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)中选择随机字符然后如果没有发生错误则备份?蛮力组合?什么是最好的方法来解决这个问题?

感谢。

3 个答案:

答案 0 :(得分:2)

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

这是一种可以找到局部最小值的算法:

请尝试依次删除每个字符。

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

答案 1 :(得分:1)

我使用“双方都是”的方法。拆分字符串将始终存在分解导致错误的子字符串的风险。我的方法是:

  1. 尽可能在字符串左侧弹出尽可能多的字符,同时仍然确保字符串会导致错误。
  2. 向右侧做同样的事。
  3. 理论上,你会留下导致错误的最小子字符串。
  4. 希望有所帮助!

答案 2 :(得分:0)

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

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