【发布时间】:2021-05-08 04:43:27
【问题描述】:
我正在尝试学习 Java 中的单元测试,以便习惯 TDD。我编写了一个简单的类,它的方法检查 2 个单词,如果第 2 个单词是第 1 个单词的字谜,则返回 true。
public static boolean isAnagram(String word, String word2) {
if(word.length() == word2.length()) {
// change both words to lowercase incase of any capitals
String lowerCase1 = word.toLowerCase();
String lowerCase2 = word2.toLowerCase();
// create an array of characters for each word
char[] charArray1 = lowerCase1.toCharArray();
char[] charArray2 = lowerCase2.toCharArray();
// sort the arrays in alphabetical order
Arrays.sort(charArray1);
Arrays.sort(charArray2);
// If the 2 arrays match then word is an anagram
if (Arrays.equals(charArray1, charArray2)) {
return true;
} else {
return false;
}
} else {
return false;
}
}
然后我的测试看起来像这样。
@Test
public void isAnagram() {
assertEquals(true, HelloWorld.isAnagram("walk", "alkw"));
}
它按预期工作,即此代码通过,如果我将第二个单词更改为“alk”,它会失败。
这里有什么我遗漏的吗?在现实生活中,您是否还会测试抛出的异常?
【问题讨论】:
-
如果您使用的是 TDD,那么对于这个小测试,您的代码太多了。在 TDD 中,为了使测试通过,代码中的所有内容都应该存在。例如,您正在检查字符串长度是否相等;但你不是在测试不等长的字符串。所以...我建议重新开始,构建你的代码并一起测试,这样你就实际上在做 TDD!
-
你应该有至少与你的代码的退出路径一样多的测试。我在您的代码中看到三个
return语句,所以我希望找到至少三个测试 - 每个return一个。我还希望看到至少一个关于不区分大小写的测试 - 例如,测试"AbcD"是否是"dCBa"的字谜。 -
您需要测试更多案例,所有案例都使用
@Test注释的不同方法。想想不同长度的字符串、空字符串、相同的字符串、只有大小写不同的字符串、空输入。 -
如果你想真正健壮,你需要考虑小写时使用的语言环境。一些字母(例如土耳其语言环境中的 I)具有令人惊讶的行为。
标签: java unit-testing junit tdd anagram