D d*_*day 1 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);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误出现在'assertEquals'行中.我不确定是否可能通过编写m/n%m来错误地计算此方法.
任何提示或建议?提前致谢.
除了这里的"数学"之外 - 在单元测试中使用循环是你不应该立即做的事情.
我的意思是:在考虑迭代并在循环中执行多个断言的测试用例之前,请执行以下操作:
@Test
public void gcdTest1_1() {
assertThat(Recursion.gcd(1,1), is(1));
}
Run Code Online (Sandbox Code Playgroud)
换句话说:编写仅测试一件事的简单测试用例.当第一个通过时,写下一个.然后,当您更自信时,请考虑这样的循环解决方案.
因为那可能会给你一个关于除以0的想法......不是你的测试中的东西!
编辑您的评论:使用请参阅,单元测试的核心思想是,它们可以帮助您查找和修复测试代码中的错误.所以看看你的例子,那里有一个很大的障碍......你正在打印一个字符串"m,n".那不会告诉你任何事情.您已经知道您的变量名为m和n.如果断言失败,最好打印m和n 的值.
最后:我改为断言那个 ; 一些其他的断言风格,我发现它会导致"更易读"的代码.使用它时,你必须使用像ham ()这样的hamcrest匹配器(google是你的朋友).