Спецификации и ScalaTest - хорошие инструменты для довольных пользователей, но они отличаются по нескольким параметрам. Вы, вероятно, захотите выбрать один в качестве основного инструмента тестирования в Scala, но не нужно отказываться от другого, потому что вы можете использовать части обоих. FeatureSpec
Например, если вам нравится синтаксис ScalaTest и синтаксис Mockito спецификаций, вы можете поместить оба файла jar в свой путь к классам и использовать их одновременно. Здесь я попытаюсь зафиксировать основные различия в философии дизайна, которые я заметил между спецификациями и ScalaTest.
Вероятно, основное философское различие между инструментами заключается в том, что спецификации предназначены для разработки на основе поведения (BDD), тогда как ScalaTest является более общим. ScalaTest предоставляет черты, которые вы можете смешивать вместе, чтобы получить желаемое поведение в своих тестовых классах, включая BDD, и вы также можете легко определить свое собственное поведение, если хотите чего-то другого.
ScalaTest поддерживает BDD через его Spec
, FeatureSpec
, WordSpec
, FlatSpec
, и GivenWhenThen
черты, а также имеет черты , которые можно смешивать , чтобы получить хороший синтаксис Сличитель. Если вам нравится «следует», вы смешиваете ShouldMatchers. Если вам нравится «must», вы можете добавить его MustMatchers
. Но если вам нравится BDD, но не нравится синтаксис сопоставления, вы можете просто использовать одну из черт ScalaTest Spec без добавления черты сопоставления. В Specs есть класс Specification, который вы расширяете, и вы должны использовать слово «must» в выражениях сопоставления. Существенная философская разница, которая здесь очевидна, заключается в том, что ScalaTest дает вам гораздо больше возможностей выбора. Чтобы упростить навигацию по этому выбору, я привожу здесь дерево решений:
http://www.scalatest.org/quick_start
Синтаксис сопоставления также отличается в ScalaTest и спецификациях. В ScalaTest я попытался увидеть, как далеко я могу зайти с обозначением операторов, и в итоге получил выражения сопоставления, которые очень похожи на английские предложения, с пробелами между словами. Синтаксис сопоставления спецификаций объединяет слова больше с верблюжьим регистром.
В Specs больше сопоставлений, чем в ScalaTest, и я думаю, что это отражает разницу в подходе к дизайну. Я фактически вырезал, вероятно, 2/3 синтаксиса сопоставления, который я построил и рассмотрел для выпуска. Я добавлю больше сопоставлений в будущих выпусках, но хотел быть уверенным, что знаю, что пользователи действительно чего-то хотят, прежде чем я добавлю это. Однако средства сопоставления ScalaTest включают в себя синтаксис сопоставления динамических свойств, который устраняет некоторые из этих недостатков. Например, в спецификациях вы можете написать java.io.File
:
file must beDirectory
Это вызовет isDirectory
и убедится, что это правда. В java.io.Files
настоящее время в ScalaTest нет специальных сопоставителей , но в 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 немного проще использовать функциональный стиль, когда вам нужно поделиться фикстуром, тогда как Specs по умолчанию продолжают традицию setUp
и tearDown
подход, популяризированный JUnit, в котором вы переназначаете переменные. перед каждым тестом. Однако, если вы хотите протестировать таким образом, в ScalaTest это тоже очень просто. Вам просто нужно добавить BeforeAndAfter
черту.
Чтобы получить больше информации о ScalaTest, вы можете посмотреть презентацию «Станьте выше с помощью ScalaTest», которую я сделал на конференции Devoxx в 2009 году здесь:
http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about