2015-09-25 56 views
2

我有一個控制檯應用程序(稍後將作爲Windows服務安裝),該應用程序基本上運行一個無限循環,從隊列中讀取消息並對該消息執行某些操作。如何在解決方案中集成測試控制檯應用程序?

我想創建一個自動化測試用例來啓動測試端到端行爲。我的問題是,在單元測試中啓動應用程序的最佳方式是什麼? 我是否使用Process.Start? 或者我可以直接引用Program.cs - static void main並運行它?

想法?示例代碼將不勝感激,謝謝!

[更新:是的,我知道這是一個集成測試。我更新了標題。我已經把業務邏輯的邏輯分開了。集成測試的價值實際上是以自動化的方式來實現的。它可以確保我所有的配置設置是否正確,還有我與集版本問題都OK,我的記錄是和數據庫,隊列和高速緩存訪​​問都運行等]

+1

理想情況下,您需要在Program.cs中有一個類爲您完成工作。所以你是Program.cs只會構造和調用該類的任何方法。這樣,如果您的控制檯應用程序中有依賴關係(例如數據),那麼您可以在單元測試中注入這些依賴項。 –

+0

如果你正在談論**單元測試** ...那麼在你的應用中,每個單獨的類(嚴格來說)測試怎麼樣?你不應該一起測試應用程序,但它的組件。此外,在角落情況下,您的應用程序(如黑匣子)可能不會/不應該得到。對於集成測試,然後使用Process.Start()運行你的應用程序,直接調用它的類將會破壞測試,因爲你的測試平臺會/可能會過度影響它的環境。 –

回答

2

當我創建此類型的設置,我把所有的工作都在一個單獨的DLL中。 Windows服務/控制檯應用程序是一個小型項目,將大部分工作委託給DLL。大多數功能測試都是針對該DLL發生的。爲了測試最終的可執行文件,我將啓動一個進程(假設您的測試正在生成消息,控制檯以您的單元測試可以測量的方式添加句柄)。

請確保您有終止的控制檯應用程序(如發送「關閉」消息)的適當方法,檢查過程實際上退出在你的單元測試。

如果您有多個單元測試都希望啓動控制檯應用程序,那麼如果每個單獨的測試啓動控制檯應用程序,它們將不能並行運行測試。在這種情況下,讓你的測試課負責開始和結束過程,而不是每個單獨的單元測試。

0

有一個相關的article in Code Project其中建議用於調試的條件編譯:

static class Program 
{ 
    static void Main() 
    { 
     #if(!DEBUG) 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
     { 
      new MyService() 
     }; 
      ServiceBase.Run(ServicesToRun); 
     #else 
      MyService myServ = new MyService(); 
      myServ.Process(); 
      // here Process is my Service function 
      // that will run when my service onstart is call 
      // you need to call your own method or function name here instead of Process(); 
     #endif 
    } 
} 
+0

他(大概)已經這樣做了。他的問題是如何測試程序,而不是如何編譯爲服務和控制檯應用程序。 –

0

是的,你可以參考.exe和調用main如果你把它公開:

public class Program 
{ 
    public static int Main(string[] args) 
    { 
     // Implementation here... 
    } 
} 

它止跌」但是,正如其他人所指出的那樣,t是一個單元測試

相關問題