2009-10-21 42 views
1

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

回答

-2

因为该命令可能偶然发生。

您可以运行测试几次,例如, 10,并测试每次订单是否正确。这将确保它不会偶然发生。

P.S.在单元测试的多个线程通常避免

+0

“单元测试中通常会避免多个线程” - ???如果您正在测试的代码(例如信号量)只能用多个线程进行测试,则不适用。 – jlstrecker 2011-07-06 18:08:59

+0

用正确的输出运行几次并不能保证它是正确的。 – Eric 2014-01-21 14:26:32

4

你描述你的一句“但这还不够好证明这一点,因为这顺序可以通过机会出现”什么是某种已知的两难困境。

1)即使您有规格,也不能确保规格符合您的意图。为了说明这一点,我将以"the limit of correctness"为例。让我们考虑一个分解函数是一种规范:

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

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

2)即使有证明算法,仍然不意味着实现在实践中是正确的。 Donald Knuth的this quote可以很好地说明这一点:

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

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

测试可以用来显示 存在错误,但从未展现 他们的缺席。

结论:你注定了,你永远不会100%确定你的代码是正确的!但东西并没有那么糟糕。对代码有高的信心通常就足够了。例如,如果使用多个线程对您来说仍然不够,您可以决定使用模糊测试,以便更多地随机化测试执行。如果你的测试总是通过,那么你可以非常确信你的代码是好的。