Яка різниця між тестовими рамками блоку ScalaTest та Scala Specs?


121

Обидва є тестовими рамками для Scala, написаними в Scala, здатними BDD (Bihavior Driven Development). І функція побудована на також може включати в себе ScalaTest рамки. Але що специфікації пропонують ScalaTest не робить? Які відмінності?


1
Я не вірю, що точно сказати, що Specs будується на ScalaTest. Зауважте, що залежність у пом не є необов'язковою. Характеристики мають можливість для своїх специфікацій запускатися як пакет ScalaTest.
Джефф Реді

scalatest забезпечує scalatestplus з конкретною підтримкою для декількох ліфтів. це може бути цікаво. Наприклад, у них є scalatestplus для гри для гри
pedrorijo91

Відповіді:


172

Specs і ScalaTest - це хороший інструмент для задоволених користувачів, але вони відрізняються кількома способами. Ймовірно, ви захочете вибрати один як основний інструмент тестування в Scala, але не потрібно відмовлятися від іншого, оскільки ви можете використовувати шматки обох. Якщо вам подобається FeatureSpecсинтаксис ScalaTest і синтаксис Mockito специфікацій, ви можете розмістити обидва jar файли на своєму classpath і використовувати обидва одночасно. Тут я спробую зафіксувати основні відмінності філософії дизайну, які я помітив між специфікаціями та ScalaTest.

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

ScalaTest підтримує BDD через його Spec, FeatureSpec, WordSpec, FlatSpec, і GivenWhenThenриси, а також має риси , які можна змішувати , щоб отримати хороший синтаксис Слічітель. Якщо вам подобається "слід", ви змішуєте програму ShouldMatchers. Якщо вам подобається "повинен", ви змішуєте MustMatchers. Але якщо вам подобається BDD, але вам не подобається синтаксис матчера, ви можете просто скористатись однією з особливостей Specala ScalaTest, не змішуючи ознаку відповідності. Specs має клас специфікації, який ви розширюєте, і ви повинні використовувати слово "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, щоб здогадатися, що це <=означає. Навпаки, специфікації набагато вільніші з операторами. Нічого поганого в цьому немає, але це різниця. Оператори можуть зробити код більш коротким, але Компроміс це ви , можливо , доведеться працювати з документацією , коли ви знайдете такі речі , як ->-, >>, |, |>, !, або ^^^(що всі вони мають особливе значення в спекуляції) в тестовому коді вашого колеги.

Ще одна філософська відмінність полягає в тому, що я намагаюся зробити ScalaTest просто легше використовувати функціональний стиль, коли вам потрібно поділитися кріпленням, тоді як Specs за замовчуванням продовжує традицію setUpта tearDownпідхід, популяризований JUnit, в якому ви перепризначаєте вар перед кожним випробуванням. Однак якщо ви хочете протестувати це, це також дуже просто в ScalaTest. Потрібно просто змішати в BeforeAndAfterрисі.

Для отримання більш детальної інформації про ScalaTest, ви можете подивитися презентацію "Станьте вище за допомогою ScalaTest", яку я прочитав на конференції Devoxx 2009 року тут:

http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about


6
Чтивість програми Scalatest є для мене головним виграшним моментом порівняно зі специфікаціями шкали.
nemoo

49

Основні відмінності (в основному, з точки зору специфікацій :-)):

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

  • У ScalaTest та специфікацій є різний набір відповідників. Ви можете порівняти їх тут для ScalaTest і тут для специфікацій. З цього боку, у специфікацій є безліч дрібних функцій, які можуть вам сподобатися під час написання вашої специфікації: xml-матри, склад матчерів (простий спосіб повторного використання матчер шляхом їх перетворення), точні відмови, детальні відмінності для довгих рядків .. .

  • Mockito отримав хорошу підтримку BDD у специфікаціях: Mockito

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

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

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

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

Я сподіваюся, що це допомагає.


Чи можна було б оновити це, щоб охопити specs2? :)
Джоффер

5

Наскільки я знаю, якщо заборонити кілька вузькоспеціалізованих особливостей, це зводиться до особистих переваг відповідно до стилю.


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


Зараз я отримую 404 за це посилання ScalaTest. Спробуйте scalatest.org/user_guide/using_junit_runner
ДНК

0

Якщо один коефіцієнт рішення - час компіляції, масштабний тест здається краще.

Наразі ми використовуємо specs2 в нашому проекті, але страждаємо від повільного часу збирання в тестах. Щойно я закінчив POC на переході до масштабного масштабу і побачив, що час компіляції зменшиться на коефіцієнт приблизно 0,82, просто переключивши 2 рамки в деяких наших джерелах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.