В чем разница между модульными тестами ScalaTest и Scala Specs?

113

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

  • 1
    Я не верю, что точно сказать, что Specs построен на ScalaTest. Обратите внимание, что зависимость в пом является необязательным. Хотя спецификации имеют возможность запускать их как набор ScalaTest.
  • 0
    scalatest предоставляет scalatestplus со специальной поддержкой нескольких библиотек. это может быть интересно. например, у них есть самый большой плюс для игровой среды
Теги:
unit-testing
comparison
scalatest

6 ответов

150
Лучший ответ

Спекуляции и 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

  • 6
    Для меня удобочитаемость Scatatals - это главный выигрыш по сравнению со спецификациями Scala.
47

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

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

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

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

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

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

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

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

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

  • 0
    Можно ли обновить это, чтобы покрыть specs2? :)
4

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

2

Поддержка 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

0

Основные отличия между 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, поскольку они могут выполняться одновременно в отдельном потоке.

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню