2015-11-02 36 views
5

現代的單元測試框架的支持,等待一臺異步單元測試的結果,就像這樣:優勢異步電動機/等待超過堵在單元測試中

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

有沒有使用過簡單地阻斷這種異步方法的任何好處?

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

是否異步並行運行測試時只提供有什麼好處?

+0

事實上,對於一個能自動化測試套件主線程是免費的並行執行更多的單元測試的支持,確實不是聽起來像一個優勢,在同步調用時被阻塞 –

回答

6

async代碼的主要好處是在客戶端上一個負責任的UI,並且在服務器端可擴展性。對於單元測試,您會獲得一定的可擴展性(這意味着整體速度的好處,因爲單元測試本質上是爆發性的)。

但這不是一個巨大的好處。你的測試會(可能)運行得更快。

我通常使用async Task這些原因單元測試方法:

  • 如果您在環境中測試代碼,然後阻塞可引起經典的死鎖問題。請注意,某些框架(例如xUnit)默認情況下始終提供上下文。即使對於其他框架,通常也需要爲單元測試ViewModels提供上下文。
  • await不包裝例外AggregateException
  • 您確實獲得了一定的可擴展性優勢,理論上它可以讓您的單元測試運行得更快。假設你的框架並行運行你的測試。
  • 爲什麼不呢?它們與同步方法一樣簡單。 async Task單元測試方法已通過各大單元測試框架自2012年
+3

所有好的和+1。但關於「爲什麼不」:您現在無法暫停調試器,並且看到IO綁定測試在那個時間點停止(甚至可能掛起)的位置。 – usr

+0

@usr:一個有效的點! –

+0

@usr Msft正在開發該功能(或計劃中,不知道我在哪裏看到了這些內容)。希望我們將有一個調試器窗口,顯示出優秀的等待點 –

1

有沒有使用這種異步方法在簡單 阻塞任何優勢?

我認爲真的取決於你正在測試什麼。如果從單元測試框架的角度來看待它,那麼我在這裏看不到任何好處。我不認爲這樣的框架需要在IO方面進行擴展。你唯一要做的就是測試你的異步API的行爲。例如,作爲庫作者,您可以擁有一個異步終結點,並測試您的代碼被不知道如何正確使用您的庫的調用程序同步阻止時發生的情況。

一個例子是:

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

如果這可能是死鎖,那麼它在異步模式下也可能有相同的缺點,儘管主線程是空閒的,但是異步操作被鎖定並等待,直到它通過備用機制被釋放 –

+0

@MrinalKamboj我不明白你的意思。 –

+0

我回答了你的回答中的評論 - //會發生這種僵局嗎?如果是的話,那麼它會在異步模式下產生類似的問題,主線程可以免費運行其他測試 –