2013-03-07 41 views
1

我正在爲一個類似於數據庫查詢的方法編寫一些簡單的單元測試:它返回可以使用極限(最多n個結果)自定義的結果列表和頁面(第n組結果)。我想測試一些情況下,如:使用生成的輸入和期望的輸出進行單元測試

  • 返回所有的結果
  • 返回受限的結果的第一頁中設置
  • 返回受限的結果的aribtrary頁面設置
  • 返回一個有限的結果集,它超支結果總數
  • 返回結果之外

我需要的總數頁面的最後一頁模擬返回的結果(有效名稱),所以我只是用一個計數器生成它們,以便根據需要製作「名稱#1」,「名稱#2」等列表。每個測試看起來(大致)如下:

public void testGetMockCandidatesLimited() throws Exception { 
    int numResults = 4; 
    setupMock(numResults); 
    results = queryFunction(...); 

    // Check that the expected number of results was returned 
    assertEquals(numResults, results.size()); 
    // Check that the results are correct and in order 
    for (int i = 0; i < numResults; i++) { 
     assertEquals(result.get(i).getName(), "Name #" + (i + 1)); 
    } 
} 

我的問題是:是否可以用這種方式「生成」預期的答案?這是一個簡單的例子,但下一步是寫一個測試編寫測試得到的每兩個結果的第二頁,我有:

final int TEST_LIMIT = 2, TEST_PAGE = 1; 
    // Check that the expected number of results was returned 
    assertEquals(numResults, results.size()); 
    // Check that the results are correct and in order 
    for (int i = TEST_LIMIT * TEST_PAGE; i < TEST_LIMIT * TEST_PAGE + TEST_LIMIT; i++) { 
     assertEquals(result.get(i).getName(), "Name #" + (i + 1)); 
    } 

現在它只是恰巧,這個測試「正確「,因爲我會承擔我期望的價值,並確保結果是」名稱#3「和」名稱#4「。然而,它也發生,我的queryFunction計算返回的結果以相同的方式(limit * page + limit類的東西)。

這是因爲如果測試以與被測單元相同的方式產生預期答案,它不會檢測到該方法是否存在錯誤。不過,使用常量命名輸入值會使測試更具可讀性,而不僅僅是將魔法整數插入到1到4之間。

爲了可讀性和可維護性(例如,在將來需要更改值時,應該如何處理這種情況),處理這種情況的最佳方法是什麼?

回答

1

在問這個問題,我想我已經確信自己的解決方案是定義預期的數值作爲常數前面爲好,如:

final int LIMIT = 2, PAGE = 1, MIN_RESULT = 3, MAX_RESULT = 4; 

...然後在使用這些值斷言。這保留了命名鍵值的所有可讀性,並且不鼓勵生成預期輸出的誘惑。在這種情況下,我仍然會使用循環來生成Name #MINName #MAX之間的每個預期名稱,但是邊界本身將顯式爲靜態。

這樣好嗎,還是有更好的方法來處理這種重複性?