IntelliJ Idea 中的 JUnit 测试
Posted
技术标签:
【中文标题】IntelliJ Idea 中的 JUnit 测试【英文标题】:JUnit testing in IntelliJ Idea 【发布时间】: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)具有令人惊讶的行为。
【参考方案1】:
您只测试了阳光外壳。我马上就能想到这些其他测试用例:
-
如果两个单词不是字谜则失败
空格被忽略
不区分大小写
空字符串或空字符串等极端情况
【讨论】:
【参考方案2】:我已经重构了您的示例代码,并围绕该代码编写了一些单元测试。
我特意创建了一个单元测试,其中两个单词都有一个空格。此单元测试不应通过。
示例代码将让您了解如何通过单元测试“练习”单个方法。
可以编写更多的单元测试。这只是给你一个想法。
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* Author milesd on 03/02/2021.
*/
public class AnagramTest
Anagram valid, diffLength, spaces;
@Before
public void setUp()
valid = new Anagram("tar", "rat");
diffLength = new Anagram("tar", "ra");
spaces = new Anagram(" ", " ");
@Test
public void testIsAnagram()
assertTrue(valid.isAnagram());
@Test
public void testIsAnagramDifferentLengths()
assertFalse(diffLength.compareLength());
@Test
public void testIsAnagramSortAndCompareWithDifferentLengths()
assertFalse(diffLength.sortAndCompare());
// This test passes - spaces are not anagrams
@Test
public void testIsAnagramWithSpaces()
assertTrue(spaces.compareLength());
assertTrue(spaces.sortAndCompare());
assertTrue(spaces.isAnagram());
class Anagram
private final String word;
private final String anotherWord;
Anagram(final String word, final String anotherWord)
this.word = word;
this.anotherWord = anotherWord;
public boolean compareLength()
return word.length() == anotherWord.length();
public boolean sortAndCompare()
final char[] lowerCaseWord = word.toLowerCase().toCharArray();
final char[] lowerCaseAnotherWord = anotherWord.toLowerCase().toCharArray();
Arrays.sort(lowerCaseWord);
Arrays.sort(lowerCaseAnotherWord);
return Arrays.equals(lowerCaseWord, lowerCaseAnotherWord);
public boolean isAnagram()
return compareLength() && sortAndCompare();
【讨论】:
以上是关于IntelliJ Idea 中的 JUnit 测试的主要内容,如果未能解决你的问题,请参考以下文章
为什么Intellij IDEA突然无法识别测试文件夹中的测试?