【发布时间】:2011-09-08 13:33:21
【问题描述】:
我想要一些关于如何测试一些可以阻塞的对象的想法,等待其他参与者。要测试的特定单元是参与者之间的通道,参与者本身是用于测试目的的模拟夹具。
验证参与者是否在预期发生死锁时会很好,但这对我来说并不是非常重要,因为可以合理地将死锁之后描述为未定义。
更关键的是验证参与者定义的交互是否没有死锁。
无论哪种情况,我都不确定最佳测试策略应该是什么。我目前的想法是让测试运行程序为每个参与者启动一个线程,休眠一段时间,然后发现子线程是否已经返回。如果它们没有及时返回,则假设它们已经死锁,并安全地终止线程,并且测试失败(如果预期死锁,则测试成功)。
这感觉有点概率,因为可能有各种各样的原因(尽管不太可能)一个线程可能需要比预期更长的时间才能完成。还有其他解决这个问题的好方法吗?
编辑:我确信测试的健全性会很好,但我认为我不需要它。我正在考虑三个级别的测试确定性。
- “实际行为已证明与预期行为相匹配”死锁不会发生
- “实际行为与预期行为匹配”死锁在 N 次测试中未发生
- “实际行为与预期行为一致”N 次测试在预期期限内完成
第一个当然是通过有价值的测试,但 ShiDoiSi 的回答说明了它的不切实际。第二个明显弱于第一个,但仍然很难;您如何确定进程网络实际上已陷入僵局?我不确定这比第一个更容易证明(可能更难)
最后一个更像我的想法。
【问题讨论】:
-
Growing Object-Oriented Software Guided by Tests 这本书有一些关于如何在多线程代码上运行测试的技巧。对不起,我不能分享更深刻的东西,但我从来没有测试过什么东西可以优雅地对僵局做出反应。我只创建了测试以确保没有死锁。
-
测试无死锁与测试死锁相同;即使发生死锁,测试仍必须完成(除非您愿意
kill一个测试失败并死锁的测试运行器。) -
这个问题让我想起了无限饼干机:davedoyle.com/prof/pastProjects/Nerd/humor/csci_sesame.html
标签: unit-testing language-agnostic deadlock verification