我已经实现了FIFO信号量,但现在我需要一种方法来测试/证明它们正常工作。一个简单的测试是创建一些尝试等待信号量然后打印带有数字的消息的线程,如果数字按顺序应该是FIFO,但这不足以证明它,因为该命令可能有偶然发生。因此,我需要一种更好的测试方法 如果必要,也可以使用锁或条件变量 感谢
答案 0 :(得分:4)
你用句子“描述的内容,但这不足以证明它,因为该命令可能偶然发生”在某种程度上是一个已知的困境。
1)即使您有规范,也无法确保规范符合意图。为了说明这一点,我将以"the limit of correctness"为例。让我们考虑一个分解函数的规范:
计算A和B,例如A * B = C
但这还不够,因为你可以拥有一个返回A=1
和B=C
的实现。添加A,B != 1
仍然可以导致A=-1
和B=-C
,因此唯一正确的规范必须说明A,B>1
。这只是为了说明编写符合真实意图的规范是多么复杂。
2)即使证明算法,仍然并不意味着实现在实践中是正确的。 Donald Knuth的this quote最能说明这一点:
谨防上述代码中的错误;一世 只是证明它是正确的,没有尝试过 它
3)测试只能揭示错误的存在,而不是他们的缺席。这句话可以追溯到Dijkstra:
测试可用于显示 存在的错误,但永远不会显示 他们的缺席。
结论:你注定要失败,根据其意图,你永远不会100%确定你的代码是正确的!但事情并没有那么糟糕。对代码有很高的置信度通常就足够了。例如,如果使用多个线程对您来说仍然不够,您可以决定使用模糊测试,以便进一步随机化测试执行。如果您的测试总是通过,那么您可以非常确信您的代码是好的。
答案 1 :(得分:-2)
因为订单可能是偶然发生的。
您可以运行几次测试,例如10,并测试每次订单是否正确。这将确保它不是偶然发生的。
P.S。通常避免单元测试中的多个线程