【发布时间】:2021-11-30 22:23:12
【问题描述】:
我有一个类ProcessingQueue,它有一个void Enqueue(Item item) 方法并且还实现了IDisposable。该类的Dispose() 方法保证一旦返回,所有入队的项目都会被处理。
如何对这个保证进行单元测试?
如果在我的单元测试中我只是调用 Dispose() 然后检查所有项目是否都已处理,这没有任何意义,因为我可能很幸运,甚至在调用 Dispose() 之前所有项目都已处理。
【问题讨论】:
-
您能否模拟处理逻辑并在那里添加某种等待或同步,以保证在您调用 Dispose 之前模拟处理不会启动?
-
您无法通过单元测试证明不存在线程竞争错误。使用可变机器负载(启动额外线程)和可变时间(随机 for 循环延迟),通过运行数天的扩展测试获得信心。仍然不能证明缺席,但会降低出现意外的几率。
-
@HansPassant,明白了,没有办法 100% 证明此类程序的正确性。但是是否至少可以编写一个测试来证明,比如说,只有一种场景,这样测试就不会依赖延迟、等待和任何其他时间安排?
-
不,随机时间对于清除并发错误至关重要。关于这种测试的一个不错的视频是here。
标签: c# multithreading dispose idisposable