Каково различие между платформами модульного теста Спецификаций ScalaTest и Scala?

Оба - BDD (Поведение Управляемая Разработка) способные платформы модульного теста для Scala, записанного в Scala. И на Спецификации построили, может также включить платформу ScalaTest. Но то, что Спецификации предлагают ScalaTest, не делает? Каковы различия?

120
задан S.L. Barth - Reinstate Monica 24 July 2012 в 09:58
поделиться

3 ответа

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

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

ScalaTest поддерживает BDD с помощью свойств Spec , FeatureSpec , WordSpec , FlatSpec и GivenWhenThen , а также имеет черты, которые вы можете смешивать, чтобы получить хороший синтаксис сопоставления. Если вам нравится «следует», вы добавляете ShouldMatchers. Если вам нравится «должен», вы смешиваете 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 и убедится, что это правда. ScalaTest не имеет специальных сопоставителей для java.io.Files в настоящее время, но в ScalaTest вы можете просто использовать динамическую проверку, подобную этой:

file must be a ('directory)

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

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

170
ответ дан 24 November 2019 в 01:39
поделиться

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

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

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

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

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

  • В specs вы можете определить примеры, которые вложены как libidum и automatically cleaned up на каждом уровне

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

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

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

48
ответ дан 24 November 2019 в 01:39
поделиться

Не профилировщик, но windbg с расширением sosex.dll может сказать вам, какие взаимоблокировки у вас есть. Найдите его здесь и прочитайте о команде! dlk.

-121--4460187-

Я бы внес незначительное изменение в решение Фредерика. Я бы использовал sp_spaceused системную хранимую процедуру, которая также будет включать в себя данные и размеры индекса.


declare c_tables cursor fast_forward for 
select table_name from information_schema.tables 

open c_tables 
declare @tablename varchar(255) 
declare @stmt nvarchar(2000) 
declare @rowcount int 
fetch next from c_tables into @tablename 

while @@fetch_status = 0 
begin 

    select @stmt = 'sp_spaceused ' + @tablename 

    exec sp_executesql @stmt

    fetch next from c_tables into @tablename 

end 

close c_tables 
deallocate c_tables 

-121--588531-

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

4
ответ дан 24 November 2019 в 01:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: