如何使用Specs2和Scalacheck自动化测试字符串参数?

10

重新编写的Scala specs2测试框架将自动化测试与scalacheck集成。在specs2文档中给出的示例中,介绍了如何使用scalacheck和specs2进行测试,可以使用整数或者像eric的json示例中那样使用更复杂的自定义生成器。

当我尝试使用一个稍微简单一些的示例时,我遇到了困难,因为我不知道如果我想要生成字符串参数,应该如何使用specs2和scalacheck。这个Quickstart示例会怎样呢?


import org.scalacheck._

对象StringSpecification扩展了属性("String") { 属性("startsWith") = Prop.forAll((a: String, b: String) => (a+b).startsWith(a)) 属性("endsWith") = Prop.forAll((a: String, b: String) => (a+b).endsWith(b)) // 这真的总是成立吗? 属性("concat") = Prop.forAll((a: String, b: String) => (a+b).length > a.length && (a+b).length > b.length ) 属性("substring") = Prop.forAll((a: String, b: String) => (a+b).substring(a.length) == b ) 属性("substring") = Prop.forAll((a: String, b: String, c: String) => (a+b+c).substring(a.length, a.length+b.length) == b ) } 取自scalacheck主页,如果使用scalacheck集成编写为Specs2规范,会是什么样子呢?

2个回答

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]

Eric.


谢谢你的回答。这真的为我澄清了一些事情。也许你想考虑将这个例子添加到示例代码树中? - Steffen

2

1
我访问上述网站时遇到了HTTP 404错误。 - Kevin Meredith
@KevinMeredith 试试这个 https://etorreborre.github.io/specs2/guide/SPECS2-3.9.1/org.specs2.guide.UseScalaCheck.html - Vigneshwaran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接