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

时间:2015-11-02 11:51:20

标签: c# .net unit-testing asynchronous async-await

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

public async Task SomeTest()
{
    var result = await SomeMethodAsync();
    // ... Verify the result ...
}

使用这种异步方法比使用简单阻塞有什么好处吗?

public void SomeTest()
{
    var result = SomeMethodAsync().Result;
    // ... Verify the result ...
}

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

2 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:1)

  

使用这种异步方法是否有任何优势   阻断?

我认为这实际上取决于您正在测试的 。如果从单元测试框架的角度来看它,那么我在这里看不到任何好处。我不认为这样的框架需要在IO方面进行扩展。您正在做的唯一事情是测试异步API的行为方式。例如,作为库作者,您可以拥有一个异步端点,并测试当调用者同步阻止您的代码时会发生什么,该调用者不了解如何正确使用您的库。

一个例子可能是:

[TestClass]
public class M
{
    [TestMethod]
    public void X()
    {
        var myService = new MyService();
        myService.FetchSomeDataAsync().Result; // Will this deadlock?
    }
}
相关问题