scalacheck中常规类的生成器

时间:2010-09-07 15:10:38

标签: testing scala scalacheck

在scalacheck的user guide中有“Generating Case Classes”段落。我修改了它的例子,使用常规类而不是case类:

import org.scalacheck._
import Gen._
import Arbitrary._

sealed abstract class Tree
object Leaf extends Tree
class Node(left:Tree, rigth:Tree, v:Int) extends Tree

object Main {

  val genLeaf = value(Leaf)
  val genNode = for{
    v <- Arbitrary.arbitrary[Int]
    left <- genTree
    rigth <- genTree
  } yield new  Node(left, rigth, v)

  val genTree:Gen[Tree] = oneOf(genLeaf, genNode)


  def main(args:Array[String]){    
    println(genTree.sample)
  }
}

似乎一切正常但我害怕在生产代码中使用这种方法之前我在这里问:是否有任何陷阱?

2 个答案:

答案 0 :(得分:2)

我认为这里没问题。在该示例中使用案例类的原因是所示的Tree是代数数据类型,可以使用案例类。对于普通的类,您无法在树上进行模式匹配,事实上,如果不声明它们,您甚至无法获得leftrightv {{1} }。

答案 1 :(得分:2)

这应该可以正常工作。就ScalaCheck而言,关于案例类的案例类没什么特别神奇的。任何旧班级都可以获得发电机,甚至可以转换为任意类型。

就测试而言,一个不同之处在于您生成的每个非案例类树都是唯一的,因此对于您生成的任何两棵树都不会是tree1 == tree2。这与案例类的不同之处在于案例类,案例类基于价值而非身份来测试相等性。当您具有基于身份而非基于值的相等性时,您可能需要更多测试来处理别名问题。