我编写了一个简单的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来错误地计算此方法。
任何提示或建议?提前谢谢。
答案 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是你的朋友)。