私のCSコースではいくつかエクササイズをしていますが、私たちはジュニットテストを行っていますが、失敗した場合にのみ教えてくれます。出力/期待された出力は私には不気味です。これらの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
}
}
実際のコードが表示されないことがありますか? – nhouser9
私のコメントはOTですが、テストの作成者に、適切なJavaDocと文字列をアサーションに書き込むように指示する傾向があります。この場合、JavaDocは乱数がテストでどのように役割を果たすかを説明するのに最適な場所です。アサーションのすべての実装(組み込みキーワードを含む)は、途中で失敗した場合に出力される説明文字列をサポートします。また、単体テストのエラーをキャッチすることは深刻な悪い考えです。彼らは例外をキャッチする代わりにスローする必要があります。 –
は、失敗しているコードを追加しました。 – BodyBingers