在使用TDD我發現自己需要測試常數(最終)散列映射包含查找值(請參閱之所以這樣的混合物在UPDATE THE CASE)正確單元測試技術
參見下面
private static final Map<Integer,String> singleDigitLookup = new HashMap<Integer, String>(){{
put(0,"Zero");put(1,"One");put(2,"Two");put(3,"Three");put(4,"Four");put(5,"Five");put(6,"Six");put(7,"Seven");
put(8,"Eight");put(9,"Nine");
}};
隨着TDD強調每次測試一件東西,所以我開始叫我的班級驗證每個元素的有效性如下。
TEST風格1
@Test
public void whenWordIsOneThenReturn1(){
assertEquals(1, WordToIntegerConverter.toInteger("One"));
}
寫第三次測試後,我認爲這是非常可笑的,並創造了反向鍵值對暫時查找,並開始呼籲在一個循環中,如下測試。
TEST樣式2
@Test
public void whenWordIsZeroThroughNineReturnIntegerConversion(){
HashMap<Integer, String> lookup = new HashMap<Integer, String>(){{
put(0,"Zero");put(1,"One");put(2,"Two");put(3,"Three");put(4,"Four");put(5,"Five");
put(6,"Six");put(7,"Seven");put(8,"Eight");put(9,"Nine");
}};
for(int i = 0; i < 10; i++) {
assertEquals(i, WordToIntegerConverter.toInteger(lookup.get(i)));
}
}
我的問題是這樣的;使用樣式1進行單元測試更好嗎?還是使用樣式2更好?
我看到了兩者的優點和缺點。例如樣式1非常簡潔,只測試一件事情,並且更容易理解。除了做大量的輸入測試套件之外,對於風格1的缺點也會導致許多微不足道的測試。樣式2的優點是較少的單元測試。樣式2的缺點有點複雜,可能會測試多個東西,但我會爭論它唯一的測試一件事是恆定散列表的有效性。
UPDATE 我從這個問題已經收到了相當數量的反彈,所以讓我進一步解釋。它不是我本人關心的常量,而是驗證了我的代碼的不同情況。這是一個實踐問題(實踐TDD通過卡塔斯)而不是生產代碼。問題在於將數字轉換爲單詞,所以我在單元測試中關心的是確保我可以正確處理不同的可能數字。還有其他的常量,我不包括例如不斷存儲青少年數字(11,12,13 ...)和十位數(20,30,40 ...)。這裏很容易犯一個錯字。
在我看來,樣式2(或樣式1)沒有任何問題。我有很多使用循環做出各種斷言的測試。只要我覆蓋我的所有代碼,我很高興。 –
好像你可以將你的查找重構爲'enum'類型而不是使用'Map'。當你有枚舉時,你可能甚至不需要單元測試常量,因爲編譯器會爲你進行類型檢查。 –
不需要測試,只是眼球,以確保它是正確的:) – ZhongYu