Оба являются BDD (Behavior Driven Development) способными unit test фреймворками для Scala, написанными в Scala. И Specs построен на, может также включать ScalaTest. Но что предлагает Specs ScalaTest? В чем отличия?
В чем разница между платформами ScalaTest и Scala Specs unit test?
Ответ 1
Спекуляции и ScalaTest являются хорошими инструментами со счастливыми пользователями, но они различаются несколькими способами. Вероятно, вы захотите выбрать один из них в качестве основного инструмента тестирования в Scala, но не должны отказываться от другого, потому что вы можете использовать куски обоих. Если вам нравится синтаксис ScalaTest FeatureSpec
и синтаксис Mockito, например, вы можете поместить оба файла jar в свой путь к классам и использовать оба одновременно. Здесь я попытаюсь уловить основные отличия в дизайне, которые я заметил между спецификациями и ScalaTest.
Вероятно, основное философское различие между инструментами заключается в том, что спецификации предназначены для Behavior-Driven Development (BDD), тогда как ScalaTest является более общим. ScalaTest предоставляет черты, которые вы можете комбинировать, чтобы получить поведение, которое вы предпочитаете в своих тестовых классах, включая BDD, и вы также можете легко определить свое поведение, если хотите что-то другое.
ScalaTest поддерживает BDD через его признаки Spec
, FeatureSpec
, WordSpec
, FlatSpec
и GivenWhenThen
, а также имеет черты, которые вы можете смешивать, чтобы получить хороший синтаксис сопоставления. Если вам нравится "должно", вы смешиваетесь в ShouldMatchers. Если вам нравится "must", вы смешиваете в MustMatchers
. Но если вам нравится BDD, но не нравится синтаксис синтаксиса, вы можете просто использовать один из признаков ScalaTest Spec без смешивания в признаке соответствия. Спецификации имеют класс спецификаций, который вы расширяете, и вы должны использовать слово "must" в своих выражениях. Большая философская разница, которая здесь очевидна, заключается в том, что ScalaTest дает вам гораздо больше возможностей. Чтобы сделать это пространство выбора более удобным для навигации, я предоставляю дерево решений здесь:
http://www.scalatest.org/quick_start
Синтаксис сопоставления также отличается между ScalaTest и спецификациями. В ScalaTest я попытался понять, как далеко я могу пойти с обозначением оператора, и в итоге получились выражения-разделители, которые очень похожи на английские предложения, с пробелами между словами. Синтаксис синтаксиса спецификаций запускает слова вместе больше с футляром для верблюда.
В спецификациях больше сокетов, чем у ScalaTest, и я думаю, что это отражает разницу в дизайне. Я фактически сократил, вероятно, 2/3 синтаксиса-сопоставления, который я построил и рассмотрел для выпуска. Я добавлю больше матчи в будущих выпусках, но хочу быть уверенным, что знал, что пользователи действительно хотят чего-то, прежде чем я его добавлю. Тем не менее, в макетах ScalaTest используется динамический синтаксис сопоставления свойств, который принимает некоторые из этих слабых сторон. Например, в Specs вы можете написать на 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, чтобы угадать, что означает это <=
. Напротив, спецификации намного свободнее с операторами. Ничего плохого в этом, но это разница. Операторы могут сделать код более кратким, но компромисс, возможно, придется запускать в документацию, когда вы найдете такие вещи, как ->-
, >>
, |
, |>
, !
или ^^^
(который все имеют специальные значения в Specs) в вашем тестовом коде коллеги.
Еще одно философское различие заключается в том, что я пытаюсь сделать это несколько проще в ScalaTest, чтобы использовать функциональный стиль, когда вам нужно предоставить доступ к оборудованию, тогда как по умолчанию функции по умолчанию продолжают традицию подхода setUp
и tearDown
популяризированный JUnit, в котором вы переназначаете vars перед каждым тестом. Однако, если вы хотите протестировать этот путь, в ScalaTest это также очень легко. Вам просто нужно перемещаться по признаку BeforeAndAfter
.
Для более глубокого понимания ScalaTest вы можете посмотреть презентацию "Get Higher with ScalaTest", которую я дал на конференции Devoxx 2009 года:
http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about
Ответ 2
Основные отличия (в основном, с точки зрения спецификаций:-)):
-
ScalaTest предоставляет больше "стилей тестирования", чем спецификаций (вы можете посетить каждую маркерную точку на странице быстрый старт, чтобы получить подробный просмотр каждого стиля)
-
ScalaTest и спецификации имеют другой набор соответствий. Вы можете сравнить их здесь для ScalaTest и здесь для спецификаций. С этой стороны спецификации имеют множество небольших функций, которые могут вам понравиться при написании вашей спецификации: xml-подборщики, составы сопоставлений (простой способ повторного использования сопоставлений путем их преобразования), точные сбои, подробные различия для длинных строк,...
-
Mockito получил отличную поддержку BDD в спецификациях: Mockito
-
имеет DataTables, которые позволяют группировать множество небольших примеров в виде таблицы (если вы можете использовать операторы, которые используются как разделители таблицы)
-
В спецификациях вы можете определить примеры, которые вложены как libidum и автоматически очищены на каждом уровне
Это, безусловно, очень частичное и предвзятое сравнение, и существует много других различий (и библиотеки все еще развиваются,...).
В конце дня я думаю, что это действительно зависит от вашего стиля тестирования/определения. Если это просто (простая структура спецификации, настройки, ожидания,...), то обе библиотеки будут очень похожи. В противном случае, оба должны понять, как это должно быть сделано. В качестве последнего примера этого вы можете взглянуть на тегирование: в ScalaTest и в specs.
Надеюсь, это поможет.
Ответ 3
Насколько я знаю, за исключением нескольких высокоспециализированных функций, это сводится к личным предпочтениям в соответствии со стилем.
Ответ 4
Поддержка IDE может быть другой точкой
Я пытаюсь заставить Specs работать с 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
Ответ 5
Если одним фактором принятия решения является время компиляции, скалатест, похоже, работает лучше.
В настоящее время мы используем specs2 в нашем проекте, но в тестах страдают от медленного времени компиляции. Я только что закончил POC по переходу в scalatest и увидел, что время компиляции уменьшилось примерно на 0,82, просто переключив 2 фреймворка в некоторые из наших источников.
Ответ 6
Основные отличия между ScalaTest и Specs2 заключаются в следующем:
- Общая структура теста в Specs2 отличается от общей в ScalaTest.
- Specs2 имеет другой набор элементов с различным синтаксисом.
- Тесты Specs2 в основном посвящены разработке с учетом поведения (BDD), тогда как тесты ScalaTest более общие.
- ScalaTest предоставляет гораздо больше возможностей выбора и универсальности. Например, для написания BDD-подобных Specs2 в ScalaTest можно использовать функции Spec, FeatureSpec, WordSpec, FlatSpec и GivenWhenThen вместе с ShouldMatchers или MustMatcher. Это дает разработчику большую гибкость, чтобы следовать его/ее собственному стилю написания спецификаций.
-
Спецификации2 имеют значительно большее количество совпадений, чем ScalaTest. Большинство из них нуждаются в особой необходимости. Например, в Specs2 вы можете сказать:
aFile mustBe aDirectory
-
Если Specs2 имеет отдельные Matchers для java.io.Files, ScalaTest не имеет аналогичных Матчи.
-
Еще одно отличие между ScalaTest и Spec заключается в неявных преобразованиях. ScalaTest имеет только одно неявное преобразование, которое мы достигаем с помощью оператора ===. Однако это можно отключить в ScalaTest, используя одну строку кода. Это единственное неявное преобразование, которое можно бесплатно получить в ScalaTest. Существуют и другие неявные преобразования, которые могут быть использованы в mixin других чертах. Вопреки этому Specs2gives вы десятки неявного преобразования, просто расширив класс Specification. На практике это не имеет большого значения. Единственное различие заключалось бы в том, что тестовый код будет более читабельным без явных преобразований.
-
В спецификациях2 есть таблицы данных. Это позволяет использовать количество примеров, которые могут управлять тестом, подобно испытаниям, основанным на свойствах.
-
Тесты Specs2 отличаются от ScalaTest, поскольку они могут выполняться одновременно в отдельном потоке.