Как использовать Specs2 с Scalacheck для автоматизации тестирования аргументов String?

Переписанная инфраструктура тестирования specs2 для Scala объединяет автоматизированное тестирование с scalacheck. В примерах, приведенных в документации для specs2, о том, как использовать scalacheck вместе со specs2, используются целые числа или более сложные пользовательские генераторы, как в примере с eric json.

Пытаясь заставить работать чуть менее сложный пример, я изо всех сил, потому что я не знаю, как можно использовать specs2 и scalacheck, если я хочу генерировать аргументы String вместо Integer. Как бы этот пример Quickstart


import org.scalacheck._

object StringSpecification extends Properties("String") { property("startsWith") = Prop.forAll((a: String, b: String) => (a+b).startsWith(a))

property("endsWith") = Prop.forAll((a: String, b: String) => (a+b).endsWith(b))

// Is this really always true? property("concat") = Prop.forAll((a: String, b: String) => (a+b).length > a.length && (a+b).length > b.length )

property("substring") = Prop.forAll((a: String, b: String) => (a+b).substring(a.length) == b )

property("substring") = Prop.forAll((a: String, b: String, c: String) => (a+b+c).substring(a.length, a.length+b.length) == b ) }

взято из взгляда на домашнюю страницу scalacheck, если оно было написано как спецификация Specs2 с использованием интеграции scalacheck?

2 ответа

Решение

Очень прямой перевод использует check метод и простые функции:

package test

import org.specs2._
import org.scalacheck._

class ScalaCheckExamples extends Specification with ScalaCheck { def is =

  "startsWith" ! check { (a: String, b: String) => (a+b).startsWith(a) }                                                ^
  "endsWith"   ! check { (a: String, b: String) => (a+b).endsWith(b) }                                                  ^
  "concat"     ! check { (a: String, b: String) => (a+b).length > a.length && (a+b).length > b.length }                 ^
  "substring"  ! check { (a: String, b: String) => (a+b).substring(a.length) == b }                                     ^
  "substring"  ! check { (a: String, b: String, c: String) => (a+b+c).substring(a.length, a.length+b.length) == b }     ^
                                                                                                                        end
 }

И результат на самом деле показывает, что concat свойство неверно:

  [info] + startsWith
  [info] + endsWith
  [error] x concat
  [error]   A counter-example is ['', ''] (after 0 try)
  [error] the value is false
  [error]  (ScalaCheckExamplesSpec.scala:6)
  [info] + substring
  [info] + substring
  [info]
  [info] Total for specification ScalaCheckExamplesSpec
  [info] Finished in 7 seconds, 547 ms
  [info] 5 examples, 401 expectations, 1 failure, 0 error
  [info]

Эрик.

Для получения дополнительной информации об использовании библиотеки ScalaCheck в specs2, обратитесь к Руководству по Matchers в спецификации specs2: http://etorreborre.github.com/specs2/guide/org.specs2.guide.Matchers.html.

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