Testing FIFO信号量测试

Testing FIFO信号量测试,testing,semaphore,fifo,Testing,Semaphore,Fifo,我已经实现了FIFO信号量,但现在我需要一种方法来测试/证明它们工作正常。一个简单的测试是创建一些线程,尝试等待一个信号量,然后打印一个带有数字的消息,如果数字符合顺序,则应该是FIFO,但这还不足以证明这一点,因为这个顺序可能是偶然发生的。因此,我需要一种更好的测试方法。 如有必要,也可以使用锁或条件变量。 谢谢 因为那个命令可能是偶然发生的 您可以运行测试几次,例如10次,并测试每次顺序是否正确。这将确保这件事不是偶然发生的 另外,单元测试中的多线程通常是被避免的你用你的句子描述的“但这不足

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

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

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


另外,单元测试中的多线程通常是被避免的

你用你的句子描述的“但这不足以证明它,因为这个顺序可能是偶然发生的”不知何故是一个已知的难题

1) 即使您有一个规范,也无法确保该规范符合您的意图。为了说明这一点,我将举一个例子。让我们考虑一个因式分解函数的规范,即:

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

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

2) 即使证明了一个算法,也不意味着实现在实践中是正确的。唐纳德·克努斯(Donald Knuth)的作品最能说明这一点:

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

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

测试可以用来显示 存在bug但从未显示 他们的缺席


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

“通常避免在单元测试中使用多个线程”-???如果您正在测试的代码(例如信号量)只能使用多个线程进行测试,则不会这样做。使用正确的输出运行某些东西几次并不能确保它是正确的。