在单元测试中异步/等待阻塞的优点

Edw*_*rey 6 .net c# unit-testing asynchronous async-await

现代单元测试框架支持等待异步单元测试的结果,如下所示:

public async Task SomeTest()
{
    var result = await SomeMethodAsync();
    // ... Verify the result ...
}
Run Code Online (Sandbox Code Playgroud)

使用这种异步方法比简单阻塞更有优势吗?

public void SomeTest()
{
    var result = SomeMethodAsync().Result;
    // ... Verify the result ...
}
Run Code Online (Sandbox Code Playgroud)

在并行运行测试时,async是否只提供了一个好处?

Ste*_*ary 8

async代码的主要好处是客户端的响应式UI和服务器端的可伸缩性.对于单元测试,您可以获得一定的可扩展性(这可以转化为整体速度优势,因为单元测试本质上是突发性的).

但这不是一个巨大的好处.您的测试(可能)运行得更快一些.

我通常使用async Task单元测试方法,原因如下:

  • 如果您在上下文中测试代码,那么阻塞可能会导致典型的死锁问题.请注意,某些框架(例如,xUnit)默认情况下始终提供上下文.即使对于其他框架,通常也需要为单元测试ViewModel提供上下文.
  • await没有包含例外AggregateException.
  • 您确实获得了一些可扩展性优势(理论上)允许您的单元测试整体运行得更快.假设您的框架并行运行测试.
  • 为什么不?它们和同步方法一样简单.async Task自2012年以来,每个主要单元测试框架都支持单元测试方法.

  • 一切都好,+1.但关于"为什么不":您现在无法暂停调试器并查看IO绑定测试在该时间点停止(甚至可能挂起)的位置. (3认同)