2012-05-29 35 views
2

但是,通過查看數據庫來驗證結果,表明在此測試的系統實際上是成功的,所以我有一個集成測試(在Visual Studio中)保持失敗。WCF/SQL Server的集成測試太慢?

這是測試的基本思想:

private static readonly EfContext db = new EfContext(); 

[TestMethod] 
void Complete_System_Run_Through_Is_Successful() 
{ 
    // Create a new unique message and request... 
    var message = Guid.NewGuid().ToString(); 
    var request = new FooRequest { Message = message }; 

    var fooClient = null; /* WCF proxy */ 
    try 
    { 
     // Call the service... 
     fooClient = new FooClient(); 
     fooClient.CallService(fooRequest); 
    } 
    finally 
    { 
     // Close client or Abort faulted client... 
     var channel = fooClient as ICommunicationObject; 
     try 
     { 
      if (channel.State != CommunicationState.Faulted) 
       channel.Close(); 
     } 
     catch { channel.Abort(); } 
    } 

    // Verify there are 15 instances (traces) present in the database... 
    var actualNumberOfTraces = db.Traces.Count(x => x.Message == message); 
    Assert.AreEqual(15, actualNumberOfTraces); 
} 

被測試的WCF服務觸發一堆其他下游服務(認爲「服務總線」),其中每個監聽服務添加一個條目(跡)到數據庫。從開始到結束,這個過程記錄了每個完整系統運行的15個這些跟蹤。

驗證數據庫中的結果表明測試運行成功(數據庫中存在所有15條曲線)。但是,測試運行失敗(在Visual Studio中),實際發現的痕跡數量在3-6之間。我唯一能想到的是,Assert被稱爲太早(即數據庫尚未完成更新)。

無論如何,一切工作正常,所有的痕跡確實存在於數據庫中,我只是有這個測試的麻煩。有什麼建議麼?

+0

如果沒有catch(包含Assert.Fail,如果這是異常情況下需要什麼)?或者wcf代理的使用塊('fooclient'),我會建議不要嘗試{...} finally {} 。有什麼可以移動到您的測試啓動或測試清理方法嗎? – Chris

+0

我已經更新了代碼示例以包含關閉/中止邏輯。這是關閉/中止WCF代理的首選方式,而不是使用語句。基本上,try/finally塊在那裏處理關閉/中止,而不是例外。 – Didaxis

+0

我會在外面嘗試一個catch塊。 – Paparazzi

回答

0

看起來你有一個異步方法調用。本文介紹WCF同步和異步行爲。

How to Call WCF Services Synchronously and Asynchronously

+0

這是異步的,因爲這些服務使用MSMQ綁定/(單向操作)。真的,我只是想弄清楚這個測試是否會實際通過*。由於這些不連貫的服務的性質,我開始認爲它不會。 – Didaxis

+1

與異步,你不應該期望它通過,所以我只是不明白它是如何增加任何價值。我認爲你需要一種不同的方法來測試這個。 – Paparazzi

0

那麼暫且醜陋的解決辦法是增加一個Thread.Sleep(250)給數據庫的時間來追趕。如果你能想出更優雅的解決方案,我絕對有興趣聽到它!

+0

一個更好的方法是等待,然後在循環中多次嘗試斷言,只要你認爲合理(比如最大30秒)即可。在代碼中放置不休息讓測試不確定,並且在不同的spec機器上會失敗。 – Paolo

+0

這是一個好主意,你可以發表一個如何做Task []的例子,WaitAll()在你正在談論的循環中調用Assert?快點讓我開始? – Didaxis