我正在爲一個類似於數據庫查詢的方法編寫一些簡單的單元測試:它返回可以使用極限(最多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之間。
爲了可讀性和可維護性(例如,在將來需要更改值時,應該如何處理這種情況),處理這種情況的最佳方法是什麼?