gpt4 book ai didi

java - 理解这些 JUnit 测试结果

转载 作者:行者123 更新时间:2023-11-30 06:54:58 25 4
gpt4 key购买 nike

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

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

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

我注意到在测试代码中也找到了值<459133821L>。然而,我仍然是一个初学者。显然 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
}



}

最佳答案

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

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

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

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

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

关于java - 理解这些 JUnit 测试结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42028679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com