2017-02-03 4 views
1

Я делаю несколько упражнений для своего курса CS, и они дают нам тесты Junit, но они только говорят нам, если мы потерпим неудачу или пройдем. Выход/ожидаемый результат для меня смехотворный.Понимание этих результатов тестов 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. Я не просмотрел весь ваш код, но эти тесты показывают вам входной вывод и то, что дает правильный ответ. Выясните, почему вы пытаетесь поразить 459133821L в testRemoveDuplicates (который с первого взгляда кажется случайным, поэтому я не уверен, как вы знаете, чего ожидать), и вы его решите.

Смежные вопросы