C# 使用nUnit测试死锁

C# 使用nUnit测试死锁,c#,unit-testing,nunit,deadlock,C#,Unit Testing,Nunit,Deadlock,我不熟悉单元测试和nUnit(2.48)。我想写一个测试方法,失败的情况是它死锁。这可能吗?显然,nUnit不知道默认情况下执行该方法需要多长时间,因此我是否必须编写代码在单独的线程上执行该工作,然后中止该线程,如果所用时间超过我定义的时间,则抛出异常?有更好的方法吗 谢谢在另一个线程上运行代码并查看它是否及时返回,当然可以测试死锁。下面是一些(非常基本的)示例代码: [TestFixture] public class DeadlockTests { [Test] public

我不熟悉单元测试和nUnit(2.48)。我想写一个测试方法,失败的情况是它死锁。这可能吗?显然,nUnit不知道默认情况下执行该方法需要多长时间,因此我是否必须编写代码在单独的线程上执行该工作,然后中止该线程,如果所用时间超过我定义的时间,则抛出异常?有更好的方法吗


谢谢

在另一个线程上运行代码并查看它是否及时返回,当然可以测试死锁。下面是一些(非常基本的)示例代码:

[TestFixture]
public class DeadlockTests
{
    [Test]
    public void TestForDeadlock()
    {
        Thread thread = new Thread(ThreadFunction);
        thread.Start();
        if (!thread.Join(5000))
        {
            Assert.Fail("Deadlock detected");
        }
    }

    private void ThreadFunction()
    {
        // do something that causes a deadlock here
        Thread.Sleep(10000);
    }
}

我不想说这是“最好的方法”,但我发现这是一种在某些场合很有用的方法。

这是可能的,但可能不是最好的方法。单元测试并不真正适合于测试并发行为,不幸的是,适合的测试方法并不多

NUnit不处理线程。您可以编写启动多个线程的测试,然后测试它们的交互。但这些将开始看起来更像是集成测试而不是单元测试


另一个问题是死锁行为通常取决于线程的调度顺序。因此,很难编写一个结论性测试来测试某个死锁问题,因为您无法控制线程调度,这是由操作系统完成的。您可能会遇到一些测试,这些测试有时在多核处理器上失败,但在单核处理器上总是成功的。

请看一看名为“Chess”的Microsoft项目。
它的目的是发现并发的bug

死锁检测相当于,因此目前在一般情况下无法解决


如果您有一个特定的问题需要防范,那么可能会有一些特定的黑客攻击,以获得至少一点安全性。但要注意,这只能是一个黑客行为,永远不会是100%。例如,这样的测试可能总是在开发机器上通过,但永远不会在生产机器上通过。

要测试死锁,必须在单元测试中实现状态图并检查当前状态图中的周期。状态图由作为节点的资源和作为边的依赖项组成。 我不知道如何实施这样的事情,但这是理论

单元测试测试数据输入和输出的正确性(主要用于后面的测试),而不是应用程序执行流的正确性


马克·希思的想法似乎是合理的,但在学术上是错误的。

如果在5001毫秒后加入会怎样?这与停顿问题无关。“及时时尚”条款确保:-)。这个测试的一个问题是它并不真正测试死锁,它只运行一个测试线程。死锁通常发生在线程之间的交互中。当然,这不是一个完美的测试,但它很简单。在thread.join中,指定的时间长度应足以在没有死锁的情况下运行代码。您还没有证明存在死锁,但这对于这种类型的测试可能不是必需的。mendelt-是的,在ThreadFunction中,您可能需要创建另一个线程。啊。我知道你现在在做什么。ThreadFunction本身会创建导致死锁的多个线程。那么我们同意了。它不会捕获所有死锁,但可能会捕获一些。。