testing - scalacheck 中常规类的生成器

标签 testing scala scalacheck

在 scalacheck 的 user guide 中有“生成案例类”段落。我修改了示例以使用常规类而不是案例类:

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)
  }
}

似乎一切正常,但在我问这里之前,我担心在生产代码中使用这种方法:有什么陷阱吗?

最佳答案

这应该可以正常工作。就 ScalaCheck 而言,案例类并没有什么特别神奇的地方。任何旧类都可以获得生成器,甚至可以转换为任意类。

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

关于testing - scalacheck 中常规类的生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3659917/

相关文章:

javascript - 如何使用 Cypress 测试客户端重定向到第 3 方站点?

http - 如何在 Java 中安全地处理原始(文件)数据?

scalacheck:生成一个非空字符串

scala - 如何减少 ScalaCheck 生成的测试用例的数量?

scala - 如何从另一个对象实例访问私有(private)字段?

scala - 如何使用 ScalaCheck 生成打乱的序列?

testing - 我可以运行 JUnit 4 以从命令行测试 Scala 代码吗?

ruby - 如何编写特定的 rspec 测试?需要建议...

java - 单元测试什么

Scala - 组合器解析,替代品的顺序似乎很重要