Зачем использовать Specs2 над JUnit?

Мы просмотрели онлайн-материалы, такие как самый масштабный сайт. Каковы преимущества использования платформы тестирования Scala Specs2? Как это добавить в проект через JUnit?

1 ответ

Я немного не хочу отвечать на это, потому что это довольно субъективная вещь.

Но я мог бы резюмировать это так: "Точно так же, как Scala предлагает вам новые и более чистые способы решения проблем с помощью Java, Specs2 дает вам новые и более чистые способы тестирования с помощью JUnit".

Несколько быстрых примеров:

Мокито - первоклассный гражданин

Mockito - моя любимая библиотека для JVM; использовать его со Specs2 так же просто, как смешать в черту, и вы получите хороший DSL для проверки:

class MySpec extends Specification with Mockito { 
   // Setup:
   val mockConnection = mock[Connection]

   ...

   // Verification: (in a test)
   there was one(mockConnection).get("www.google.com")
}  

ScalaCheck - первоклассный гражданин

ScalaCheck может сэкономить кучу времени, "размывающего" входные данные для ваших функций, и опять же, простой миксин характеристик получает всю вашу мощь в ваших тестах Specs2.

Запустите тест в Scope

У вас когда-нибудь возникала проблема, когда тесты работали на вашей машине, но не проходили в других местах, потому что ваша машина запускала их в определенном порядке? Или попал в "адский насмешливый" из-за взаимодействий между закоренелым поведением сотрудника? Specs2 позволяет поместить весь тест в область видимости, чтобы он содержал все это состояние, и предотвращал его утечку в другие тесты:

class AnotherSpec extends Specification with Mockito {

  class FooScope extends Scope {
    val mockResponse = mock[Response]
    val mockConnection = mock[Connection]
    ...
    mockConnection.execute returns mockResponse

    def frobulate(s:String) = {
      // Use mockResponse, mockConnection, etc ...
    }
  }

"My thing" should {

  "Do stuff" in new FooScope {
    frobulate("hello")

    there was one(mockConnection).post(...)
  }
}

Scopes поможет вам высушить ваши тесты, а также остановить утечки состояния между ними.

плюс

  • "Блоки" для группировки связанных тестов ("My thing" should)
  • Читаемые, разделенные пробелами имена тестов ("throw an exception if argument < 0" in)
  • Читаемый DSL для сопоставления (result must have length(7))
  • Спички для Скала-идиоматических типов (result must beNone)
  • Легко временно отключить тест с pending
  • Генерация отчетов / вывода HTML с DSL

Downsides

В попытке сделать этот ответ немного более объективным, я должен также указать на эту статью уважаемого Билла Веннерса о времени компиляции, которая указывает, что Specs2 mutable.Specificationиз-за большого числа имплицитов и объявлений функций компиляция почти на порядок медленнее, чем примерно эквивалентный тест JUnit. Он также плохо масштабируется при большом количестве тестов. Или, по крайней мере, этого не произошло, когда статья была написана в начале 2013 года. Сейчас есть подходы, которые можно использовать для решения этой проблемы.

Другие вопросы по тегам