Каков наилучший способ убедиться, что вывод стабилен при использовании junit? - PullRequest
1 голос
/ 18 декабря 2011

У меня есть метод, который принимает структуру данных и записывает в OutputStream.Я хотел бы написать модульный тест, который гарантирует, что выходные данные этой функции для данного входа не изменятся неожиданно.

Я думаю, что у меня тест структурирован правильно, с использованием теорий JUnit.Мои @DataPoints - это пары идентификаторов и примерные структуры данных, и у меня есть @Theory, что выходные данные метода будут идентичны файлу, зарегистрированному для контроля версий, который я получаю с использованием getResourceAsStream с использованием идентификатора.

Однако болезненная часть - это создание этих файлов.Мое текущее очень уродливое решение - логическая константа с именем WRITE_TEST_OUTPUT, которая обычно ложна.Когда я хочу сгенерировать выходные файлы (либо потому, что я изменил список @DataPoints, либо изменилось желаемое поведение метода), я устанавливаю для этой константы значение true, и есть тест, который при значении true снова запускает функциюзаписать текущие выходные файлы в каталог в / tmp.Затем он утверждает, что константа является ложной, поэтому я не случайно проверяю версию, в которой константа является истинной.

Очень удобно, чтобы поколение выдавало себя за тест, чтобы я мог запустить его изв Затмении, но это похоже на ужасный клудж.Это похоже на то, что люди должны делать постоянно - какие решения нашли другие люди?

1 Ответ

1 голос
/ 18 декабря 2011

Что я, вероятно, сделаю, это обнаружу существование файла, а не использую внешне измененную константу.Таким образом, у вас будет что-то вроде

public void testMethodOutput() {
  if (new File(expectedOutput).exists()) {
    // check method output against file
  } else {
    // generate expected output from current behaviour; test passes automatically
    // (saves output to the expected-output file)
  }
}

Когда вы захотите обновить ожидаемый вывод, удалите файл, запустите тесты, передайте новую версию для контроля версий.Смена источника не требуется.

Кажется немного странным, что правильный вывод определяется по тому, что делает данная версия программы, а не по тому, что вы сами настроили (что если в этой версии есть небольшая ошибка?).Возможно, это намек на то, что ваш тест слишком грубый, а это, в свою очередь, намекает на то, что ваш метод сам слишком грубый.(Испытательные запахи - это почти всегда запахи дизайна.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...