2016-11-10 55 views
1

我已經寫了一個簡單的GCD函數來實現歐幾里德的算法來計算最大公約數gcd(m,n),這是最大的整數k除以m和n。如何糾正我的單元測試的GCD功能

,我寫的函數編譯成功:

public static int gcd(int m, int n) { 
     if (n == 0) return m; 
     return gcd(n, m%n); 
    } 

不過,我碰到一個錯誤,當我寫GCD單元測試:

@Test public void gcdTest() { 
     for (int m = 0; m < 15; m++) { 
     for (int n = 0; n < 15; n++) { 
     assertEquals("Divide m,n", m/n%m, Recursion.gcd(m,n)); 
     } 
     } 
    } 

的錯誤出現在「的assertEquals」線。我不確定是否可能通過寫m/n%m來錯誤地計算這種方法。

任何提示或建議?提前致謝。

+2

由於在兩個for-loops中都以0開頭,所以您有類似0/0%0的情況。 –

+0

@StefanFreitag甚至沒有想過!現在我從兩個for循環開始。然而,我得到一個錯誤,說除以m,n預計爲0,但爲1. –

+1

@Dday提示:不打印「m,n」...打印m和n的實際值。該消息應該幫助**識別那些不起作用的值!然後看到我的答案;-) – GhostCat

回答

5

除了這裏的「數學」的東西 - 在單元測試中使用循環是你不應該立即做的事情。

我的意思是:你認爲之前關於測試用例是迭代和做多的一個循環中聲稱,做這樣的事情

@Test 
public void gcdTest1_1() { 
    assertThat(Recursion.gcd(1,1), is(1)); 
} 

換句話說:編寫簡單的測試用例是測試只有一個件事。當第一個通過時,寫下一個。然後,當你更自信時,再考慮這種循環解決方案。

因爲這可能會給你一個關於除以0的想法......在你的測試中沒有的東西!

編輯您的評論:使用看,核心單元測試的想法是,他們幫助您找到並修復您的代碼在測試中的錯誤。所以看你的例子,這裏面的一個大障礙是......你正在打印一個字符串「m,n」。這並沒有告訴你任何事情。你已經知道你的變量被稱爲m和n。在斷言失敗的情況下,您最好打印m和n的

最後:我改爲斷言那;一些其他風格的斷言,我發現導致「更具可讀性」的代碼。使用時,你將不得不使用Hamcrest匹配器,如is()雖然(谷歌是你的朋友在這裏)。