Оба - BDD (Поведение Управляемая Разработка) способные платформы модульного теста для Scala, записанного в Scala. И на Спецификации построили, может также включить платформу ScalaTest. Но то, что Спецификации предлагают ScalaTest, не делает? Каковы различия?
Спецификации и 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
Основные различия (в основном с точки зрения спецификаций :-) ):
ScalaTest предоставляет больше "стилей тестирования", чем спецификаций (вы можете посетить каждую точку на странице быстрый старт, чтобы получить подробное представление о каждом стиле)
ScalaTest и спецификации имеют свой набор матчей. Вы можете сравнить их здесь для ScalaTest и здесь для спецификаций. С этой стороны спецификации имеют множество мелких особенностей, которые могут вам понравиться при написании спецификации: xml матчеры, матчерная композиция (простой способ повторного использования матчеров путем их трансформации), точные ошибки, детальные различия для длинных строк, ...
Mockito получил хорошую поддержку BDD в спецификациях: Mockito
specs имеет DataTables, которые позволяют сгруппировать множество маленьких примеров в своего рода таблицу (если вы можете стоять операторами, используемыми в качестве разделителей таблиц)
В specs вы можете определить примеры, которые вложены как libidum и automatically cleaned up на каждом уровне
Это, конечно, очень частичное и предвзятое сравнение, и многие другие различия существуют (а библиотеки все еще развиваются, ...) . ..).
В конце концов, я думаю, что это действительно зависит от вашего стиля тестирования/указания. Если он простой (простая структура спецификации, настройки, ожидания, ...), то обе библиотеки будут выглядеть очень похожими. В противном случае, обе библиотеки будут иметь свою точку зрения на то, как все должно быть сделано. В качестве последнего примера можно посмотреть на тегирование: в ScalaTest и в specs.
Надеюсь, это поможет.
Не профилировщик, но 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- Насколько я знаю, за исключением нескольких узкоспециализированных функций, это сводится к личному предпочтению в соответствии со стилем.