如何使用Scalacheck的Specs2自动测试String参数?

时间:2011-06-07 09:18:01

标签: scala specs scalacheck specs2

Scala重写的specs2测试框架将自动化测试与scalacheck集成在一起。 specs2文档中提供了有关如何将scalacheck与specs2一起使用的示例use integers或更复杂的自定义生成器,如eric's json example

虽然试图让一个稍微不那么复杂的例子工作,但我正在努力,因为我不知道如果我想生成String参数而不是整数,会如何使用specs2和scalacheck。这个快速入门示例如何


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 homepage外观,是否使用scalacheck集成编写为Specs2规范?

2 个答案:

答案 0 :(得分:17)

非常直接的翻译是使用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]

埃里克。

答案 1 :(得分:2)

有关在specs2中使用ScalaCheck库的更多信息,请查看specs2文档中的匹配器指南:http://etorreborre.github.com/specs2/guide/org.specs2.guide.Matchers.html#ScalaCheck+properties