标签:判断 很多 事件 https 运算 表达 添加 http 因此
在做某个项目的时候需要产生大量正确的or错误的四则运算表达来作为测试样例,bug的发现在于产生测试样例的程序中。
expressionLength
expressionLength
减1expressionLength
大于0时不断重复第10步到第14步expressionLength
减1上文的正确表达式的产生中有4种输出步骤:操作数、运算符、左括号、右括号,其中括号是概率生成。而错误的表达式就是在正确的表达式的基础上,用一个概率让且仅让一个输出步骤不进行输出(比如一个加号、一个减号、一个操作数1……)。标识符isWrongExpression
表示将输出错误表达式,变量notMiss
表示某一个步骤不丢失的概率。
每次执行输出步骤的函数,都要执行以下步骤:
notMiss
初始化置为1,表示不丢失isWrongExpression
为真,则让变量notMiss
以一定概率变为0(该输出步骤丢失的概率),同时将标志isWrongExpression
置为假(因为只需要让一个输出步骤丢失)notMiss
为0则不输出。因为输出步骤丢失为概率事件,因此可能出现都不丢失的情况,此时强制让最后一个操作数进行丢失操作。
这时候bug出现了:存在输出步骤全都不丢失的情况。
一开始进行debug,因为很多步骤的出现都是概率事件,所以bug出现的概率不定,问题点也很难找到(也是自己debug能力不足的原因)。一开始以为是最后的强制丢失出现了问题。后来发现当标志isWrongExpression
为假,同时变量notMiss
为0时,出现不丢失,此时不会触发强制丢失。后来在经历了长时间逐步调试后,找到了满足丢失条件但没有执行丢失步骤的地方——匹配右括号操作。
问题找到了。因为左右括号的出现都是概率事件,一开始代码的设计是:
bug出现的原因在于,概率筛选结果为丢失,然后修改了标志isWrongExpression
和变量notMiss
;尔后若概率筛选不生成括号,也就是要丢失的内容是不存在的东西。但此时标志位已经被修改为“已经产生了丢失”状态了。解决方法很简单:在概率筛选结果为生成括号之后,再进行概率筛选是否丢失即可。
应该在需要用到的时候才进行变量的定义、函数的调用等等。此处在一开始的时候就一股脑的认为每个生成步骤都需要进行概率筛选是否丢失,因此在每个步骤的一开始就进行了函数processMissP()
的调用。
标签:判断 很多 事件 https 运算 表达 添加 http 因此
原文地址:https://www.cnblogs.com/okcokc/p/13191686.html