理解这些JUnit测试结果

时间:2017-02-03 16:24:15

标签: java junit

我正在为我的CS课程做一些练习,他们正在给我们Junit测试但是他们只告诉我们是否失败或通过。输出/预期输出对我来说是胡言乱语。

我以这种方式获得预期的输出/输出:

java.lang.AssertionError: expected <3143794514> but was <459133821> 

我注意到值&lt; 459133821L&gt;也可以在测试代码中找到。但是,我还是初学者。显然,adler32旨在通过校验和检查错误,但我不知道如何利用它。有没有办法让这个节目更有意义的消息,所以我知道我的代码出了什么问题?

例如:我应该计算字符串中的所有单词。这些测试可以告诉我输入/输出返回的错误答案是什么?

以下是JUnit类的示例:

import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.*;
import java.io.*;
import java.util.zip.Adler32;

public class TestStringProblems {

    private static final int RUNS = 100000;
    private static final int SEED = 12345;
    private StringProblems sp = new StringProblems();

    @Test
    public void testCountWords() {
        BufferedReader br = null;
        Adler32 check = new Adler32();
        int count = 0;
        try {
            br = new BufferedReader(new FileReader("warandpeace.txt"));
            String line = br.readLine();
            while(line != null) {
                int words = sp.countWords(line.trim());
                count += words;
                check.update(words);
                line = br.readLine(); 
            }
        } catch(IOException e) { System.out.println("Error: " + e); assertTrue(false); }
        finally { try { br.close(); } catch(Exception e) { } }
        assertEquals(count, 562491); // number of words in War and Peace
        assertEquals(check.getValue(), 2309395892L); // checksum of word counts
    }

    @Test
    public void testRemoveDuplicates() {
        Adler32 check = new Adler32();
        java.util.Random rng = new java.util.Random(SEED);
        for(int i = 0; i < RUNS; i++) {
            StringBuilder sb = new StringBuilder();
            int len = rng.nextInt(500);
            for(int j = 0; j < len; j++) {
                char c = (char)(1 + rng.nextInt(50000));
                int rep = rng.nextInt(10) + 1;
                for(int k = 0; k < rep; k++) {
                    sb.append(c);
                }
            }
            check.update(sp.removeDuplicates(sb.toString()).getBytes());
        }
        assertEquals(check.getValue(), 459133821L);
    }


}

感谢。

public class StringProblems {

    public String removeDuplicates(String s) {
        String newStr = "";
        if (s.length() == 0) {
            return s;
        }

        int length = s.length() - 1;
        for(int i = 0;i<length+1;i++) {
            if(i!=0 && s.charAt(i)!=s.charAt(i-1)) {
                newStr += s.charAt(i);
            }
        }


        return s.charAt(0) + newStr;
    }

    public int countWords(String s) {
        String newStr = s.trim(); // removes unnecessary whitespace

        if (newStr.isEmpty()) {
            return 0;
        }

        return newStr.split("\\W+").length; // should work since it creates an array of substrings, 
                                            // length should indicate how many substrings are in the new string
    }



}

1 个答案:

答案 0 :(得分:1)

你是“预期”而“实际”是落后的。

http://junit.sourceforge.net/javadoc/org/junit/Assert.html

assertEquals的第一个参数是EXPECTED,第二个是ACTUAL。

您看到的错误显然是在这一行:assertEquals(check.getValue(), 459133821L);

您需要交换预期和实际值,然后还要修复计算。如果你想获得459133821L,你仍然得到错误的答案。我没有查看你的所有代码,但是这些测试向你显示输入输出以及为你提供正确答案的内容。弄清楚为什么你试图在testRemoveDuplicates中击中459133821L(一眼看上去似乎是随机使用所以我不知道你怎么知道会发生什么),你会解决它。