如何纠正GCD功能的单元测试

时间:2016-11-10 19:40:53

标签: java testing recursion

我编写了一个简单的GCD函数来实现Euclid算法,用于计算最大公约数gcd(m,n),这是除以m和n的最大整数k。

我写的功能成功编译:

   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来错误地计算此方法。

任何提示或建议?提前谢谢。

1 个答案:

答案 0 :(得分:5)

除了&#34;数学&#34;这里的事情 - 在单元测试中使用循环是你不应该立即做的事情。

我的意思是:在考虑迭代的测试用例并在循环中执行多个断言之前,请执行以下操作:

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

换句话说:编写仅测试一个事物的简单测试用例。当第一个通过时,写下一个。然后,当你更自信时,请考虑这种循环解决方案。

因为这可能会让你有关于除以0的想法......在你的测试中不是一件事!

根据您的评论进行编辑:请参阅单元测试的核心理念,它们可以帮助您查找和修复测试代码中的错误。所以看看你的例子,那里有一个很大的障碍......你正在打印一个字符串&#34; m,n&#34;。那不会告诉你任何事情。您已经知道您的变量名为m和n。如果断言失败,最好打印m和n的

最后:我改为断言;一些其他的断言风格,我发现这导致了更具可读性的#34;码。使用时,你必须使用像是()这样的hamcrest匹配器(google是你的朋友)。