2017-10-06 86 views
1

我們有一個啓動時間爲幾分鐘的WCF服務,因爲大量數據必須加載到內存中。單元測試WCF服務啓動時間較長

我們的問題是,我們如何測試我們所有的方法而不需要重新啓動服務?

詳細:

  • 我們測試從另一個WCF服務的服務合同的方法,讓我們只有一次開始我們的WCF服務。即,我們開始我們的服務,測試服務和後者調用我們的服務來運行相關的單元測試。

  • 對於不需要內存中數據的方法,我們只是在服務內部實現單元測試。

  • 我們的問題涉及所有需要內存中的數據而不是數據合同的一部分的方法。我們如何實現這些方法的單元測試,以便我們可以運行多個測試,並且服務只能啓動一次?實際上,我們在服務內部實現了這些單元測試,但是如果我們運行測試,服務必須在測試完成後立即啓動並關閉。

請注意,無法將相關方法移動到庫中或將其添加到服務合約中。

回答

0

如果我正確理解你,你遇到的主要問題是處理你的WCF服務的狀態,因爲它在啓動時需要它。

首先,很高興看到您對不依賴服務狀態的所有測試用例分別實施了單元測試

當談到測試狀態的方法,你需要集成測試(但我不想這樣做,因爲術語的頭髮 - 分裂)。爲此,在執行任何測試(隨後可能相互依賴)之前,您只需在安裝方法中初始化您的服務一次。

您正在使用哪種測試框架? NUnit,MSTest還是其他? 假設你使用NUnit,你會使用[OneTimeSetUp]-attribute初始化WCF服務和使用需要的服務的每個測試實例(和國家,分別爲數據)進行初始化:

namespace Foo 
{ 
    [TestFixture] 
    public class YourServiceTests 
    { 
    private IYourService _service; 

    [OneTimeSetUp] 
    public void Init() 
    { 
     /* Do whatever is necessary to initialize the service */ 
     _service = CreateNewInstance(); 
    } 

    [OneTimeTearDown] 
    public void Cleanup() 
    { 
     /* optionally provide a teardown method to gracefully shutdown the service */ 
    } 

    [Test] 
    public void TestA() 
    { 
     var expected = "bar"; 
     var actual = _service.MethodA(); 
     Assert.That(actual, Is.EqualTo(expected)); 
    } 

    [Test] 
    public void TestB() 
    { 
     // ... 
    } 
    } 
} 

-

關於你提到的其他關注(「我們的問題涉及需要在內存中的數據,並沒有數據合同的一部分,所有的方法。」),我會使用類似的方法:

因爲你想測試不屬於的方法IYourService -contract你基本上做的和上面一樣([OneTimeSetUp]),但是現在你要初始化IYourService的具體實現(例如, YourService)。然後,您將能夠訪問並測試所有其他公共方法,這些方法不能通過界面/合同訪問。

+0

非常感謝,[OneTimeSetUp] - 屬性正是我所搜索的。但是,你的意思是'你可以訪問和測試所有其他公共方法,這些方法不能通過界面/合同訪問'。這隻適用於公共方法嗎?我們如何測試私有和內部方法? – user2992131

+0

很高興在這裏:-)通常你不會直接測試私有方法。當他們從公共方法中調用時,他們會被間接測試。對於內部方法,您可以使用['InternalsVisibleTo'-attribute](https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute(v = vs.110).aspx)。 – khlr

+0

非常感謝。 – user2992131