Обидва є тестовими рамками для Scala, написаними в Scala, здатними BDD (Bihavior Driven Development). І функція побудована на також може включати в себе ScalaTest рамки. Але що специфікації пропонують ScalaTest не робить? Які відмінності?
Обидва є тестовими рамками для Scala, написаними в Scala, здатними BDD (Bihavior Driven Development). І функція побудована на також може включати в себе ScalaTest рамки. Але що специфікації пропонують ScalaTest не робить? Які відмінності?
Відповіді:
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
Основні відмінності (в основному, з точки зору специфікацій :-)):
ScalaTest надає більше "стилів тестування", ніж специфікації (ви можете відвідати кожну точку кулі на сторінці швидкого початку, щоб отримати детальний перегляд кожного стилю)
У ScalaTest та специфікацій є різний набір відповідників. Ви можете порівняти їх тут для ScalaTest і тут для специфікацій. З цього боку, у специфікацій є безліч дрібних функцій, які можуть вам сподобатися під час написання вашої специфікації: xml-матри, склад матчерів (простий спосіб повторного використання матчер шляхом їх перетворення), точні відмови, детальні відмінності для довгих рядків .. .
Mockito отримав хорошу підтримку BDD у специфікаціях: Mockito
specs має DataTables, які дозволяють групувати безліч невеликих прикладів у вигляді якоїсь таблиці (якщо ви можете витримати операторів, які використовуються як роздільники таблиці)
У специфікаціях можна визначити приклади, які вкладені як libidum і автоматично очищаються на кожному рівні
Це, звичайно, дуже часткове і упереджене порівняння, і багато інших відмінностей існують (а бібліотеки все ще розвиваються, ...).
Наприкінці дня я думаю, що це дійсно залежить від вашого стилю тестування / уточнення. Якщо це просто (проста структура специфікацій, налаштування, очікування, ...), то обидві бібліотеки будуть здаватися дуже схожими. В іншому випадку обидва мають свій погляд на те, як слід робити. Як останній приклад цього, ви можете подивитися на теги: у ScalaTest та в специфікаціях .
Я сподіваюся, що це допомагає.
Наскільки я знаю, якщо заборонити кілька вузькоспеціалізованих особливостей, це зводиться до особистих переваг відповідно до стилю.
Підтримка 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
Якщо один коефіцієнт рішення - час компіляції, масштабний тест здається краще.
Наразі ми використовуємо specs2 в нашому проекті, але страждаємо від повільного часу збирання в тестах. Щойно я закінчив POC на переході до масштабного масштабу і побачив, що час компіляції зменшиться на коефіцієнт приблизно 0,82, просто переключивши 2 рамки в деяких наших джерелах.