Как использовать 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.