2017-02-03 12 views
1

私の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 
    } 



} 
+0

実際のコードが表示されないことがありますか? – nhouser9

+1

私のコメントはOTですが、テストの作成者に、適切なJavaDocと文字列をアサーションに書き込むように指示する傾向があります。この場合、JavaDocは乱数がテストでどのように役割を果たすかを説明するのに最適な場所です。アサーションのすべての実装(組み込みキーワードを含む)は、途中で失敗した場合に出力される説明文字列をサポートします。また、単体テストのエラーをキャッチすることは深刻な悪い考えです。彼らは例外をキャッチする代わりにスローする必要があります。 –

+0

は、失敗しているコードを追加しました。 – BodyBingers

答えて

1

あなたは「期待」し、「実際」は後方です。

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

のassertEqualsの最初のパラメータが期待されている、第二の実際です。

あなたが見ているエラーは、明らかにこのラインに発射されています。assertEquals(check.getValue(), 459133821L);

はあなたの予想と実績を交換して、またあなたの計算を修正する必要があります。 459133821Lを取得しようとすると、間違った答えが得られます。私はすべてのコードを調べていませんが、これらのテストでは入力結果と正しい答えを提供するものが示されています。 testRemoveDuplicatesの中で459133821Lをヒットしようとしている理由を理解してください(これは一見するとランダムなので、どのようにして何を期待するか分かりません)。

関連する問題