2016-11-10 26 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()虽然(谷歌是你的朋友在这里)。