gpt4 book ai didi

c# - 如何修复挂起 TeamCity 构建的多线程单元测试?

转载 作者:太空宇宙 更新时间:2023-11-03 14:10:32 25 4
gpt4 key购买 nike

在 TeamCity 上的 CI 期间,我们遇到了一个单元测试一天失败几次的问题。我们使用 MSTest 和 RhinoMocks。在开发机器上重现它几乎是不可能的(可能是因为开发机器上有 1 个 cpu PC,我不知道)。

[TestMethod]
[TestCategory("UnitTest")]
[ExpectedException(typeof(AggregateException))]
public void TestRiskDataStagingThrowAggregateException()
{
DataStagingThrowException(typeof(DeskRiskDataPump));
}

protected void DataStagingThrowException(Type dataPumpType)
{
// set expectations
foreach (IUploader uploader in StubUploaders)
{
uploader.Expect(x => x.Upload(StubDataProvider)).Repeat.Once().Throw(new Exception("BANG!!!"));
}

Repository.ReplayAll();

IDataPump datapump = new DataPumpFactory().GetDataPump(dataPumpType, StubDataProvider, StubUploaders, StubDistributor);

// Execute
// the test can hang here!!!
datapump.Execute();

Repository.VerifyAll();
}

StubDataProvider = Repository.Stub<IEnumerable<TRecord>>();
StubUploaders = new List<IUploader>();
StubDistributor = Repository.Stub<IDataDistributor>();

StubUploaders.Add(Repository.Stub<IUploader>());
StubUploaders.Add(Repository.Stub<IUploader>());
StubUploaders.Add(Repository.Stub<IUploader>());

实现 IDataPump 的类有点复杂,我不敢在这里发布它:) 通常它实现生产者-消费者模式并在不同的流中启动一些进程,像这样

Task[] tasks = new Task[4];

// Start adding to the queue
tasks[0] = Task.Factory.StartNew(Produce);

// Start draining the queue in parallel
tasks[1] = Task.Factory.StartNew(ConsumeCreditRisk);
tasks[2] = Task.Factory.StartNew(ConsumeTrancheRisk);
tasks[3] = Task.Factory.StartNew(ConsumeRatesRisk);

// Wait to complete
try
{
Task.WaitAll(tasks);
}
catch (AggregateException e)
{
.....
throw;
}

private void ConsumeCreditRisk()
{
_creditRiskUploader.Upload(_creditRiskBuffer.GetConsumingEnumerable());
}

在我们的例子中,上传者是假设抛出异常的 stub ,它应该作为聚合异常被捕获。但根据日志,它有时会卡在 stub 方法上传上。

您有什么可能导致问题的建议吗?

最佳答案

实际上,您需要为任何多线程测试提供超时,以防止死锁搞砸您的构建。不过,这是一种解决方法。

关于c# - 如何修复挂起 TeamCity 构建的多线程单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com