1

在我们的项目中,我们有几千个单元测试。其中一些是集成测试,需要更大的设置,并且还使用多线程/异步部分,以及设置对象的统一性。

这些集成测试通常运行得非常顺利,但在某些情况下,当执行解决方案中的所有测试(约 2.5k)时,异步组件似乎由于某种原因陷入死锁。(测试因超时而中止)

我已经上下搜索了几个小时的代码,但找不到任何可能发生死锁的原因。

顺便说一句,我们使用轮询来等待重新同步线程:

var foo = new SomethingThatIsModifiedByTheAsyncThreads();
this.SetupEverything();
this.AsyncComponentX.StartSomething(foo);

// wait for completion
while (foo.State != fooStates.AllDone)
{
Thread.Sleep(10);
}

// check output
Assert.IsTrue(this.CheckThatAllIsRight(foo));

这不是最好的方法,但我认为这不是问题(其他想法?).. 所以,对我来说,异步的东西似乎根本没有完成,它没有设置将 foo.State 设置为 AllDone。但怎么可能呢?为什么只有在我运行(而不是调试)大量测试时才会发生这种情况?我怀疑 MSTest 有点搞砸了线程(其中有四个),而不是让它们运行。(顺便说一句,异步的东西作为特殊的异步模块运行,它们作为一个消息队列工作,每个都有一个工作线程/消息消费者线程。但是这些类似乎已经过尝试并且是真的。)

也很难弄清楚那里发生了什么,我正在努力扩展异步部分的日志记录。但是,我仍然不知道问题可能出在哪里,或者如何在不运行所有测试的情况下重现问题..任何指针?:/ 我已经阅读了有关 MSTest 的一些线程问题.. 是否有一些特殊的事情需要考虑?

4

0 回答 0