Сравнение текстовых файлов с Junit

Простым способом было бы использовать фреймворк PHP, такой как CodeIgniter или Laravel , которые имеют встроенные функции, такие как фильтрация и активная запись, так что вам не нужно беспокоиться об этих нюансах.

45
задан Cœur 2 January 2018 в 02:51
поделиться

5 ответов

junit-дополнения имеет хорошую поддержку его: FileAssert

Это дает Вам исключения как:

junitx.framework.ComparisonFailure: aa Line [3] expected: [b] but was:[a]
31
ответ дан Uooo 26 November 2019 в 20:55
поделиться

Вот один простой подход для проверки, если файлы точно то же:

assertEquals("The files differ!", 
    FileUtils.readFileToString(file1, "utf-8"), 
    FileUtils.readFileToString(file2, "utf-8"));

, Где file1 и file2 File, экземпляры, и FileUtils от Apache Commons IO .

Не много собственного кода для Вас для поддержания, который всегда является плюс.:) И очень легкий, если Вы уже, оказывается, используете Apache палата общин в Вашем проекте. Но никакие хорошие, подробные сообщения об ошибках как в решение .

метки Редактирование :
Heh, смотря ближе FileUtils API, существует даже более простой путь :

assertTrue("The files differ!", FileUtils.contentEquals(file1, file2));

В качестве награды, эта версия работает на все файлы, не просто текст.

43
ответ дан Community 26 November 2019 в 20:55
поделиться

Я предложил бы использовать Assert.assertThat и hamcrest matcher (junit 4.5 или позже - возможно, даже 4.4).

я закончил бы с чем-то как:

assertThat(fileUnderTest, containsExactText(expectedFile));

, где мой matcher:

class FileMatcher {
   static Matcher<File> containsExactText(File expectedFile){
      return new TypeSafeMatcher<File>(){
         String failure;
         public boolean matchesSafely(File underTest){
            //create readers for each/convert to strings
            //Your implementation here, something like:
              String line;
              while ((line = expected.readLine()) != null) {
                 Matcher<?> equalsMatcher = CoreMatchers.equalTo(line);
                 String actualLine = actual.readLine();
                 if (!equalsMatcher.matches(actualLine){
                    failure = equalsMatcher.describeFailure(actualLine);
                    return false;
                 }
              }
              //record failures for uneven lines
         }

         public String describeFailure(File underTest);
             return failure;
         }
      }
   }
}

профессионалы Matcher:

  • Состав и повторное использование
  • Использование в нормальном коде, а также тесте
    • Наборы
    • Используемый в ложной платформе (платформах)
    • Могут использоваться общая функция предиката
  • , Действительно хорошая способность журнала
  • Может быть объединена с другим matchers и описаниями, и описания отказа точны и точные

Недостатки:

  • Хорошо это - довольно очевидное право? Это - путь, более подробный, чем утверждают или junitx (для этого конкретного случая)
  • , необходимо будет, вероятно, включать hamcrest, освобождает для извлечения максимальную пользу
7
ответ дан Stephen 26 November 2019 в 20:55
поделиться

Если ожидается имеет больше строк, чем фактический, Вы приведете assertEquals к сбою прежде, чем добраться до assertNull позже.

довольно легко зафиксировать хотя:

public static void assertReaders(BufferedReader expected,
    BufferedReader actual) throws IOException {
  String expectedLine;
  while ((expectedLine = expected.readLine()) != null) {
    String actualLine = actual.readLine();
    assertNotNull("Expected had more lines then the actual.", actualLine);
    assertEquals(expectedLine, actualLine);
  }
  assertNull("Actual had more lines then the expected.", actual.readLine());
}
4
ответ дан Jon Skeet 26 November 2019 в 20:55
поделиться
20
ответ дан 26 November 2019 в 20:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: