В чем разница между модульными тестами ScalaTest и Scala Specs? - PullRequest
118 голосов
/ 08 февраля 2010

Оба являются BDD (Behavior Driven Development) способными модульными тестовыми средами для Scala, написанными на Scala.И Спецификации основаны на и могут включать в себя ScalaTest .Но что же предлагает Specs ScalaTest?В чем различия?

Ответы [ 5 ]

170 голосов
/ 26 февраля 2010

Спецификации и ScalaTest являются хорошими инструментами для счастливых пользователей, но отличаются по нескольким параметрам. Возможно, вы захотите выбрать один в качестве основного инструмента тестирования в Scala, но вам не нужно отказываться от другого, потому что вы можете использовать части обоих. Если вам нравится, например, синтаксис ScalaTest FeatureSpec и синтаксис Mockito для спецификаций, вы можете поместить оба файла jar в путь к своим классам и использовать оба одновременно. Здесь я попытаюсь описать основные различия в философии дизайна, которые я заметил между спецификациями и ScalaTest.

Вероятно, основное философское различие между инструментами заключается в том, что спецификации предназначены для разработки на основе поведения (BDD), тогда как ScalaTest является более общим. ScalaTest предоставляет черты, которые вы можете смешивать вместе, чтобы получить поведение, которое вы предпочитаете в своих тестовых классах, включая BDD, и вы также можете легко определить свое собственное поведение, если вы хотите что-то другое.

ScalaTest поддерживает BDD через свои черты Spec, FeatureSpec, WordSpec, FlatSpec и GivenWhenThen, а также имеет черты, которые вы можете смешивать, чтобы получить хороший синтаксис соответствия. Если вам нравится «следует», вы смешиваете с «Должны». Если вам нравится «must», вы смешиваете MustMatchers. Но если вам нравится BDD, но не нравится синтаксис matcher, вы можете просто использовать одну из спецификаций ScalaTest Spec без смешения с чертой matchers. У Specs есть класс Specification, который вы расширяете, и вы должны использовать слово «must» в выражениях вашего сопоставителя. Большая философская разница, которая здесь очевидна, заключается в том, что ScalaTest предоставляет вам гораздо больше возможностей. Чтобы облегчить навигацию по этому выбору, я приведу здесь дерево решений:

http://www.scalatest.org/quick_start

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

В спецификациях больше соответствий, чем в ScalaTest, и это, я думаю, отражает разницу в подходе к дизайну. На самом деле я сократил, вероятно, 2/3 синтаксиса соответствия, который я создал и рассматривал для выпуска. Я добавлю больше соответствий в будущих выпусках, но хотел быть уверен, что я знал, что пользователи действительно чего-то хотели, прежде чем я его добавил. Однако средства сопоставления ScalaTest включают синтаксис динамического сопоставления свойств, который устраняет некоторые из этих недостатков. Например, в спецификации вы можете написать на java.io.File:

file must beDirectory

Это вызовет isDirectory и убедится, что это правда. В ScalaTest в настоящее время нет специальных совпадений для java.io.Files, но в ScalaTest вы можете просто использовать динамическую проверку, подобную этой:

file must be a ('directory)

Каждый раз, когда вы передаете символ после be, он будет использовать отражение для поиска (в данном случае) метода или поля с именем directory или метода с именем isDirectory. Есть также способ сделать это статическим, определив BePropertyMatcher (который обычно требует только 2 или 3 строки кода). Так что в основном в ScalaTest я стараюсь предоставлять больше функциональности с меньшим количеством API.

Еще одна общая разница в дизайне между спецификациями и ScalaTestвключает в себя неявные преобразования. По умолчанию вы получаете только одно неявное преобразование при использовании ScalaTest, которое ставит оператор === для всего. (Если вам нужно, вы можете «отключить» это неявное преобразование одной строкой кода. Единственная причина, по которой вам нужно это сделать, - это если вы пытаетесь протестировать что-то, имеющее собственный оператор ===, и вы получаете конфликт.) ScalaTest определяет много других неявных преобразований, но чтобы использовать их, вам нужно явно «пригласить» их в свой код, смешивая в себе черту или выполняя импорт. Когда вы расширяете класс Specification в спецификациях, я думаю, вы по умолчанию получаете десятки неявных преобразований. Я не уверен, насколько это будет иметь значение на практике, но я полагаю, что люди захотят тестировать код, который использует свои собственные последствия, и иногда может возникнуть конфликт между последствиями инфраструктуры тестирования и производственным кодом. Когда это произойдет, я думаю, что в ScalaTest обойти проблему будет легче, чем спецификации.

Еще одно отличие в дизайне, которое я заметил, это комфорт с операторами. Одна из моих целей заключалась в том, чтобы любой программист, смотрящий на чужой тестовый код, использующий ScalaTest, мог догадаться, в чем смысл, ничего не изучая в документации ScalaTest. Я хотел, чтобы клиентский код ScalaTest был совершенно очевиден. Одним из проявлений этой цели является то, что ScalaTest очень консервативен в отношении операторов. Я определяю только пять операторов в ScalaTest:

  • ===, что означает равно
  • >, что означает больше, чем
  • <, меньше
  • >=, больше или равно
  • <=, меньше или равно.

Вот и все. Так что эти вещи в значительной степени похожи на то, что означают. Если вы видите в чужом коде:

result should be <= 7

Я надеюсь, что вам не нужно будет обращаться к документации API, чтобы угадать, что означает <=. В отличие от спецификаций гораздо свободнее с операторами. В этом нет ничего плохого, но это разница. Операторы могут сделать код более кратким, но компромисс в том, что вам, возможно, придется обратиться к документации, когда вы найдете такие вещи, как ->-, >>, |, |>, ! или ^^^ (что у всех есть особые значения в спецификациях) в тестовом коде вашего коллеги.

Еще одно философское отличие состоит в том, что в ScalaTest я немного упрощаю использование функционального стиля, когда вам нужно совместно использовать осветитель, тогда как спецификации по умолчанию продолжают традицию подхода setUp и tearDown. популяризируется JUnit, в котором вы переделываете переменные перед каждым тестом. Однако, если вы хотите проверить это, в ScalaTest это тоже очень просто. Вам просто нужно смешать черту BeforeAndAfter.

Чтобы получить более подробную информацию о ScalaTest, вы можете посмотреть презентацию «Получите больше с ScalaTest», которую я дал на конференции Devoxx 2009 года здесь:

http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about

48 голосов
/ 10 февраля 2010

Основные отличия (в основном с точки зрения спецификации :-)):

  • ScalaTest предоставляет больше «стилей тестирования», чем спецификации (вы можете посетить каждую точку маркера на странице Быстрый старт , чтобы получить подробный обзор каждого стиля)

  • ScalaTest и спецификации имеют разные наборы совпадений. Вы можете сравнить их здесь для ScalaTest и здесь для спецификаций. С другой стороны, у спецификаций есть много мелких особенностей, которые могут вам понравиться при написании вашей спецификации: сопоставители xml, составление сопоставлений (простой способ многократного использования сопоставителей, их преобразование), точные ошибки, подробные различия для длинных строк, .

  • Mockito получил хорошую поддержку BDD в спецификациях: Mockito

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

  • В спецификациях вы можете определить примеры, которые вложены как libidum и автоматически очищаются на каждом уровне

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

В конце концов, я думаю, что это действительно зависит от вашего стиля тестирования / определения. Если это просто (простая структура спецификаций, настройки, ожидания, ...), тогда обе библиотеки будут очень похожими. В противном случае у обоих есть свой взгляд на то, как все должно быть сделано. В качестве последнего примера вы можете взглянуть на тегирование: в ScalaTest и в specs .

Надеюсь, это поможет.

4 голосов
/ 08 февраля 2010

Насколько я знаю, за исключением нескольких узкоспециализированных функций, все сводится к личным предпочтениям в зависимости от стиля.

2 голосов
/ 17 сентября 2010

Поддержка IDE может быть другой точкой

Я пытался заставить Spec работать с Eclipse через JUnit, и я обнаружил, что официальное решение немного "хакерское". Настройка параметров: http://code.google.com/p/specs/wiki/RunningSpecs#Run_your_specification_with_JUnit4_in_Eclipse

Интеграция ScalaTest (в том числе и через JUnit) кажется немного менее хакерской. Тем не менее, у меня нет ни одного из них, чтобы работать так же хорошо, как JUnit и Java.

Настройка ScalaTest: http://groups.google.com/group/scalatest-users/web/running-scalatest-from-eclipse

0 голосов
/ 15 декабря 2015

Если одним из факторов принятия решения является время компиляции, скалярное вычисление работает лучше.

В настоящее время мы используем specs2 в нашем проекте, но страдаем от медленного времени компиляции в тестах. Я только что закончил POC при переходе на самое масштабное и увидел, что время компиляции сократилось примерно в 0,82 раза, просто переключив 2 фреймворка в некоторых наших источниках.

...