2011-11-17 90 views
1

首先,請原諒我使用術語「單元」,或許我的意思是集成測試。但是,在這種情況下,我將DAO方法的測試視爲一個單元,而不是試圖模擬下劃線數據庫。如何組織或分類單元測試DAO搜索方法

我一直在試圖測試搜索特定實體中的特定DAO方法 -

public Factor GetMatchingFactor(int aircraftStoresConfigurationId, int stationId, DateTime timeStamp) 
{ 
    // code etc.... 
} 

不,通常情況下,我嘗試有幾個單元測試,也許幾個每個參數,以確保每一個是妥善處理。當這個方法本身處理這個參數時,我對此很滿意,而且更糟糕的是調用一個依賴關係,我可以使用mocks/stub來測試。但是,在這種特定的方法中,方法的結果不是純函數或一個參數,而是參數和測試數據的函數。

因此,我很難定義諸如

public void TestThatAircraftStoresConfigurationIdParameterIsApplied 
public void TestThatStationIdParameterIsApplied 
public void TestThatTimeStampParameterIsApplied 

測試,他們的名字被錯誤地,每個不只是測試的一件事。

這也意味着我努力遵循每個測試只有一個斷言的規則。

因此,我測試了這種方法,使用下面的代碼覆蓋範圍相同,可能更有意義。

[Test] 
    public void TestReturnsCorrectResult() 
    { 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 10, 00, 00)).Id, Is.EqualTo(1), "Test 1"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 11, 00, 00)).Id, Is.EqualTo(1), "Test 2"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 19, 00, 00)).Id, Is.EqualTo(1), "Test 3"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 19, 00, 01)).Id, Is.EqualTo(2), "Test 4"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 19, 00, 02)).Id, Is.EqualTo(2), "Test 5"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(1), "Test 6"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station10Id, new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(1), "Test 7"); 
     Assert.That(_sut.GetMatchingFactor(10002, Station.Station11Id, new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(3), "Test 8"); 
     Assert.That(_sut.GetMatchingFactor(10002, Station.Station12Id, new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(3), "Test 9"); 
    } 

我不喜歡多重斷言,但它似乎是構建這些測試的唯一合乎邏輯的方法。任何人都可以提出更好的選擇?

回答

1

這看起來很適合NUnit 2.5中的TestCases。你可以重寫你的代碼如下:

[TestCase(10001, Station.Station9Id, 2011, 11, 16, 10, 00, 00, 1)] 
[TestCase(10001, Station.Station9Id, 2011, 11, 16, 11, 00, 00, 1)] 
[TestCase(10001, Station.Station9Id, 2011, 11, 16, 19, 00, 00, 1)] 
[TestCase(10001, Station.Station9Id, 2011, 11, 16, 19, 00, 01, 2)] 
[TestCase(10001, Station.Station9Id, 2011, 11, 16, 19, 00, 02, 2)] 
[TestCase(10001, Station.Station9Id, 2011, 11, 16, 14, 00, 00, 1)] 
[TestCase(10001, Station.Station10Id, 2011, 11, 16, 14, 00, 00, 1)] 
[TestCase(10002, Station.Station11Id, 2011, 11, 16, 14, 00, 00, 3)] 
[TestCase(10002, Station.Station12Id, 2011, 11, 16, 14, 00, 00, 3)] 
public void TestReturnsCorrectResult(int configId, int stationId, int yy, int mm, int dd, int h, int m, int s, int expectedResult) 
{ 
    Assert.That(_sut.GetMatchingFactor(configId, stationId, new DateTime(yy,mm,dd,h,m,s)).Id, Is.EqualTo(expectedResult)); 
} 

現在只有一個斷言,但有多個事情正在測試。對於您所描述的集成測試來說,這非常棒。

請注意,您只能通過TestCase屬性傳遞常量,因此您無法新建DateTime對象。相反,您必須將年,月,日等作爲參數傳遞給方法,然後自己實例化DateTime。

您也可以考慮使用一些T4腳本從其他一些數據(例如CSV文件)中生成TestCase屬性。過去我使用這種方法取得了相當大的成功,它允許最終用戶在Excel中創建測試用例,然後將它們傳遞給您。