Как обрабатывать большие строки в модульных тестах?

У меня вопрос о методах тестирования работы со строками. Каждый раз я пишу новый тест для метода, который имеет строку в качестве параметра.

Теперь возникают некоторые проблемы:

  • Как включить в тестовую строку \ n, \ r, \ t, умляуты и т. д.?
  • Как установить кодировку?
  • Должен ли я использовать внешние файлы, открываемые FileInputStream? (слишком много накладных расходов, имхо)

Итак ... каковы ваши подходы к решению этой проблемы?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
2 571
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

  • Если у вас их много, храните тестовые строки в отдельном классе со строковыми константами.
  • Старайтесь не хранить файлы на диске без необходимости. Я согласен с вашим утверждением - это приводит к слишком большим накладным расходам (не говоря уже о том, что произойдет, если вы начнете получать ошибки ввода-вывода)
  • Убедитесь, что вы тестируете строки с разными разрывами строки (\n, \r\n, \r\n\r) для разных ОС

Итак, вы предлагаете использовать строковые литералы в модульных тестах? Даже если они слишком длинные (например, 200 строк?)

guerda 20.01.2009 18:14

Это вопрос удобства. Если вы считаете, что они достаточно длинные, чтобы вставить внешний файл и начать работу с вводом-выводом в тестах, сделайте это. В противном случае да, оставьте их в тестах, но аккуратно их организовывайте.

Yuval Adam 20.01.2009 18:24
Ответ принят как подходящий

How to include a test string with \n, \r, \t, umlauts etc?

Гм ... просто напечатай так, как хочешь? Вы можете использовать \ n, \ r и \ t, умляуты stc. в строковых литералах Java; если вас беспокоит кодировка файла исходного кода, вы можете использовать Управляющие последовательности Unicode, и вы можете создавать их с помощью инструмента native2ascii, который поставляется с JDK.

How to set the encoding?

Когда у вас есть Java String, слишком поздно беспокоиться о кодировках - они используют UTF-16, и любые проблемы с кодированием возникают при переводе между строками и байтовыми массивами (в отличие от C, Java четко разделяет эти концепции)

Редактировать: Если ваши строки слишком велики, чтобы их можно было удобно использовать в исходном коде, или вы действительно беспокоитесь об обработке разрывов строк и пробелов, то, вероятно, лучше всего хранить каждую строку в отдельном файле; в этом случае кодировка должна быть указана при чтении файла (в конструкторе InputStreamReader)

Вы можете использовать язык сценариев для написания тестов.

JRuby и Groovy поддерживают документы ЗДЕСЬ, которые упрощают определение большой строки, охватывающей несколько строк.

# In JRuby
mystring = <<EOS
This is a long string that
spans multiple lines.
EOS

# In Groovy
def mystring = """This is a long string that
spans multiple lines."""

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

Я не понимаю твоего представления. Зачем мне сценарий тест для класса Java?

guerda 20.01.2009 23:41

Не сценарий, а для написания собственно теста на Groovy / JRuby. Не уверен насчет JRuby, но у вас есть возможность взаимодействия с Java в Groovy, и поэтому вы можете тестировать свои классы с помощью Groovy.

Chii 21.01.2009 13:32

Если вы неоднократно используете символы, которые трудно выразить в буквальных строках (например, ", \, символы не в [ -~]), то вам может потребоваться выполнить быстрый поиск и замену строки перед ее использованием. Например, если вы используете \ a lot, вы можете написать функцию для обмена \ и /. Вы можете использовать многосимвольную последовательность для представления символов с диакритическими знаками.

Однако существует очевидная опасность получить решение, несоразмерное проблеме. Иногда \u#### просто проще.

Если вы собираетесь использовать файлы, отличные от Java, я предлагаю открывать их как ресурсы (Class.getResourceAsStream / getResource), а не как отдельные файлы.

Для БОЛЬШИХ строк я бы использовал файлы. Производительность достаточно высока для модульных тестов. Для этого небольшого компромисса вы:

  1. Не нужно беспокоиться о побеге персонажей
  2. Может различать контент в системе управления версиями
  3. Может проверять документы независимо (например, xml / html)

Другие вопросы по теме