我刚接触单元测试和nUnit (2.48)。我想写一个测试方法,失败的情况是它死锁了。这个是可能的吗?显然,nUnit不知道默认情况下方法应该执行多长时间,所以我是否必须编写代码在单独的线程上完成工作,然后中止它,如果花费的时间比我定义的时间长,则抛出和异常?有没有更好的方法来做这件事?
谢谢
发布于 2009-01-23 12:39:45
这是可能的,但可能不是最好的做法。单元测试并不真正适合于测试并发行为,不幸的是,没有很多适合的测试方法。
NUnit不会对线程做任何事情。您可以编写启动多个线程的测试,然后测试它们之间的交互。但是这些测试看起来更像是集成测试,而不是单元测试。
另一个问题是,死锁行为通常取决于线程的调度顺序。因此,很难编写一个决定性的测试来测试某个死锁问题,因为您无法控制线程调度,这是由操作系统完成的。您可能会遇到在多核处理器上有时会失败,但在单核处理器上总是成功的测试。
发布于 2009-01-23 12:38:12
当然,可以通过在另一个线程上运行您的代码并查看它是否及时返回来测试死锁。下面是一些(非常基本的)示例代码:
[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);
}
}我不想说这是“最好的方法”,但我发现它在某些情况下很有用。
发布于 2009-01-23 12:47:43
死锁检测等同于halting problem,因此目前在一般情况下无法解决。
如果你有一个特定的问题要防范,可能会有特定的黑客攻击,以获得至少少量的安全性。但请注意,这只能是一种黑客行为,永远不会是100%。例如,这样的测试可能总是在开发机器上通过,但在生产机器上永远不会通过。
https://stackoverflow.com/questions/472700
复制相似问题