Testing FIFO信号量测试
我已经实现了FIFO信号量,但现在我需要一种方法来测试/证明它们工作正常。一个简单的测试是创建一些线程,尝试等待一个信号量,然后打印一个带有数字的消息,如果数字符合顺序,则应该是FIFO,但这还不足以证明这一点,因为这个顺序可能是偶然发生的。因此,我需要一种更好的测试方法。Testing FIFO信号量测试,testing,semaphore,fifo,Testing,Semaphore,Fifo,我已经实现了FIFO信号量,但现在我需要一种方法来测试/证明它们工作正常。一个简单的测试是创建一些线程,尝试等待一个信号量,然后打印一个带有数字的消息,如果数字符合顺序,则应该是FIFO,但这还不足以证明这一点,因为这个顺序可能是偶然发生的。因此,我需要一种更好的测试方法。 如有必要,也可以使用锁或条件变量。 谢谢 因为那个命令可能是偶然发生的 您可以运行测试几次,例如10次,并测试每次顺序是否正确。这将确保这件事不是偶然发生的 另外,单元测试中的多线程通常是被避免的你用你的句子描述的“但这不足
如有必要,也可以使用锁或条件变量。
谢谢 因为那个命令可能是偶然发生的 您可以运行测试几次,例如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%确信你的代码是正确的!但事情并没有那么糟。对代码有很高的信心通常就足够了。例如,如果使用多个线程对您来说仍然不够,那么您可以决定也使用模糊化,以便更加随机地执行测试。如果您的测试总是通过,那么,您就可以非常确信您的代码是好的。“通常避免在单元测试中使用多个线程”-???如果您正在测试的代码(例如信号量)只能使用多个线程进行测试,则不会这样做。使用正确的输出运行某些东西几次并不能确保它是正确的。