线程安全的单元测试?

The*_*ean 66 .net c# nunit unit-testing thread-safety

我写了一个类和许多单元测试,但我没有让它线程安全.现在,我想让类线程安全,但为了证明它并使用TDD,我想在开始重构之前编写一些失败的单元测试.

有什么好办法吗?

我的第一个想法是创建一些线程并让它们以不安全的方式使用该类.用足够的线程做足够的时间,我一定会看到它破裂.

Dro*_*per 21

有两种产品可以帮助您:

两者都检查代码中的死锁(通过单元测试),我认为Chess也会检查竞争条件.

使用这两种工具很简单 - 您可以编写一个简单的单元测试并多次运行代码,并检查代码中是否存在死锁/竞争条件.

编辑: 谷歌发布了一个工具,用于检查调用线程竞争测试的运行时(不是在测试期间)的竞争条件.
它不会找到所有的竞争条件,因为它只分析当前的运行而不是像上面的工具那样的所有可能的情况,但它可能会帮助你找到竞争条件一旦发生.

更新: Typemock站点不再有到Racer的链接,并且在过去的4年中没有更新.我猜这个项目已经关闭了.


Max*_*kin 10

问题在于,大多数多线程问题,如竞争条件,本质上都是不确定的.它们可以依赖于您无法模拟或触发的硬件行为.

这意味着,即使您使用多个线程进行测试,如果您的代码中存在缺陷,它们也不会始终失败.


jer*_*jvl 5

请注意,Dror的答案没有明确说明这一点,但至少Chess(可能还有Racer)通过在所有可能的交错中运行一组线程来获得可重现的错误.他们不只是运行线程一段时间,希望如果有错误,它将发生巧合.

例如,Chess将遍历所有交错,然后为您提供一个标记字符串,表示发现死锁的交错,以便您可以使用从死锁视角感兴趣的特定交错来归因您的测试.

我不知道这个工具的确切内部工作方式,以及它如何将这些标记字符串映射回您可能正在修改以修复死锁的代码,但是您有它...我实际上真的很期待这个工具(和Pex)成为VS IDE的一部分.