2

我已经实现了 FIFO 信号量,但现在我需要一种方法来测试/证明它们是否正常工作。一个简单的测试是创建一些线程尝试在信号量上等待,然后打印带有数字的消息,如果数字按顺序排列,则它应该是 FIFO,但这不足以证明这一点,因为该顺序可能有偶然发生的。因此,我需要一种更好的测试方法。
如有必要,也可以使用锁或条件变量。
谢谢

4

2 回答 2

4

你用你的句子描述的“但这不足以证明它,因为这个顺序可能是偶然发生的”在某种程度上是一个已知的困境。

1) 即使你有一个规范,你也不能保证这个规范符合你的意图。为了说明这一点,我将从“正确性的极限”中举一个例子。让我们考虑一个分解函数的规范,它是:

计算 A 和 B,例如 A *​​ B = C

但这还不够,因为您可以有一个返回A=1and的实现B=C。添加A,B != 1仍然可以导致A=-1and B=-C,因此唯一正确的规范必须声明A,B>1。这只是为了说明编写符合真实意图的规范是多么复杂。

2)即使已经证明了一个算法,仍然不意味着实现在实践中是正确的。Donald Knuth的这句话最好地说明了这一点:

注意上述代码中的错误;我只是证明它是正确的,没有尝试过。

3)测试只能揭示bug的存在,而不是它们的缺失。这句话可以追溯到Dijkstra

测试可以用来显示错误的存在,但永远不能显示它们不存在。

结论:你注定要失败,你永远不会 100% 确定你的代码按照它的意图是正确的!但事情并没有那么糟糕。对代码有很高的信心通常就足够了。例如,如果使用多个线程对您来说仍然不够,您可以决定也使用模糊测试,以使测试执行更加随机化。如果您的测试总是通过,那么您可以确信您的代码是好的。

于 2010-02-01T19:13:56.493 回答
-2

因为这个命令可能是偶然发生的。

您可以运行测试几次,例如 10 次,并在每次顺序正确时进行测试。这将确保它不是偶然发生的。

PS 通常避免单元测试中的多个线程

于 2009-10-21T04:45:12.993 回答