gpt4 book ai didi

c# - 单元测试 - 如何检查类是否并行访问外部资源?

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:36 24 4
gpt4 key购买 nike

我有一个类可以从 Web 服务中读取一些数据。它应该并行进行。我想编写一个单元测试以确保它并行执行而不是顺序执行。

我用产生延迟(例如 1 秒)的 stub 替换了 Web 服务。我测量总执行时间。如果方法调用时间少于 (delay * 1.1),我假设处理是并行发生的并且测试通过。

是否有更优雅的方法来实现此测试(例如,通过测量线程数)?

PS 该类目前正在使用TPL实现并行调用:

IEnumerable<Task<ItineraryExternalReference>> asyncTasks = from dataSourceSiteId in dataSourceSiteIds
select this.ProcessBookingAsync(dataSourceSiteId, booking);

var externalReferences = await Task.WhenAll(asyncTasks);
return externalReferences;

最佳答案

您可以使用“异步信号”( TaskCompletionSource<T> ) 来控制您的单元测试 stub 。在这种情况下,是这样的:

class WebServiceStub : IWebService
{
public int RequiredConcurrentRequests = 2;
private TaskCompletionSource<object> _signal = new TaskCompletionSource<object>();
async Task<T> IWebService.ProcessBookingAsync(id, booking)
{
if (Interlocked.Decrement(ref RequiredConcurrentRequests) == 0)
_signal.TrySetResult(null);
await _signal.Task;
return ...;
}
}

这并不理想,因为它实际上会挂起单元测试而不是失败,但这在并发单元测试过程中是常见的。

关于c# - 单元测试 - 如何检查类是否并行访问外部资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22857641/

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