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配置JUnit进行单元测试

JUnit单元测试--IntelliJ IDEA

使用JUnit配置IntelliJ IDEA以进行单元测试

为什么Intellij IDEA突然无法识别测试文件夹中的测试?

Intellij idea Junit单元测试不显示代码覆盖率

选择要运行的配置类型时,在 IntelliJ IDEA 15 中运行 Gradle 测试而不是 Junit 测试