现代单元测试框架支持等待异步单元测试的结果,如下所示:
public async Task SomeTest()
{
var result = await SomeMethodAsync();
// ... Verify the result ...
}
与简单的阻塞相比,使用这种异步方法有什么优势吗?
public void SomeTest()
{
var result = SomeMethodAsync().Result;
// ... Verify the result ...
}
异步是否只在并行运行测试时提供好处?
最佳答案
async
代码的主要好处是客户端的响应式 UI 和服务器端的可扩展性。对于单元测试,您可以获得一些可扩展性(这转化为整体速度优势,因为单元测试本质上是突发的)。
但这并不是一个巨大的好处。您的测试(可能)会运行得更快一些。
我通常使用 async Task
单元测试方法,原因如下:
- 如果您在上下文中测试代码,那么阻塞可能会导致典型的死锁问题。请注意,某些框架(例如 xUnit)始终默认提供上下文。即使对于其他框架,通常也需要提供上下文来对 ViewModel 进行单元测试。
await
不会将异常包装在AggregateException
中。- 您确实获得了一些可扩展性优势,这(理论上)可以让您的单元测试总体上运行得更快。假设您的框架并行运行您的测试。
- 为什么不呢?它们与同步方法一样简单。自 2012 年以来,每个主要单元测试框架都支持
async Task
单元测试方法。
关于c# - async/await 在单元测试中优于阻塞的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33476959/