使用ScalaCheck生成数据库数据
Using ScalaCheck to generate database data
有没有办法使用 ScalaCheck 生成伪造的数据库数据?例如,如果我将我的数据库架构定义泵入 ScalaCheck,是否有一种方法可以生成我需要的东西来测试我拥有的每个模型?有没有办法让它保持参照完整性?
您将需要为模型手动创建生成器。您可以为任何对象和 class 从生成器创建任意实例。例如:
case class Hoge(a: String, b: Int)
可以轻松生成:
val hogeGen: Generator[Hoge] = for {
aGen <- arbitrary[String]
bGen <- arbitrary[Int]
} yield Hoge(aGen, bGen)
为了在您的 属性 测试中自动使用它,您将需要生成器的隐式任意实例。我建议在编写这些时包括类型以避免出现问题。
implicit val arbHoge: Arbitrary[Hoge] = Arbitrary(hogeGen)
您也可以跳过生成器步骤,只写 implicit val arbHoge: Arbitrary[Hoge] = Arbitrary(for { ... } yield Hoge(...))
但是,如果您处理的是一些真实的数据库,则很可能会有嵌套结构。
case class Fuga(h: Hoge, i: Int)
既然你已经为 Hoge
定义了生成器,我们可以用同样的方法为 Fuga
编写一个生成器。
val fugaGen: Generator[Fuga] = for {
hGen <- hogeGen
iGen <- arbitrary[Int]
} yield Fuga(hGen, iGen)
您也可以使用 Hoge 的任意实例,就像我们使用 scalacheck 中可用的标准任意整数一样,arbitrary[Hoge]
最后一点,如果您只处理非常基本的结构,例如本例中的 Hoge
,那么您可以只使用 shapeless 并跳过手动定义。
有没有办法使用 ScalaCheck 生成伪造的数据库数据?例如,如果我将我的数据库架构定义泵入 ScalaCheck,是否有一种方法可以生成我需要的东西来测试我拥有的每个模型?有没有办法让它保持参照完整性?
您将需要为模型手动创建生成器。您可以为任何对象和 class 从生成器创建任意实例。例如:
case class Hoge(a: String, b: Int)
可以轻松生成:
val hogeGen: Generator[Hoge] = for {
aGen <- arbitrary[String]
bGen <- arbitrary[Int]
} yield Hoge(aGen, bGen)
为了在您的 属性 测试中自动使用它,您将需要生成器的隐式任意实例。我建议在编写这些时包括类型以避免出现问题。
implicit val arbHoge: Arbitrary[Hoge] = Arbitrary(hogeGen)
您也可以跳过生成器步骤,只写 implicit val arbHoge: Arbitrary[Hoge] = Arbitrary(for { ... } yield Hoge(...))
但是,如果您处理的是一些真实的数据库,则很可能会有嵌套结构。
case class Fuga(h: Hoge, i: Int)
既然你已经为 Hoge
定义了生成器,我们可以用同样的方法为 Fuga
编写一个生成器。
val fugaGen: Generator[Fuga] = for {
hGen <- hogeGen
iGen <- arbitrary[Int]
} yield Fuga(hGen, iGen)
您也可以使用 Hoge 的任意实例,就像我们使用 scalacheck 中可用的标准任意整数一样,arbitrary[Hoge]
最后一点,如果您只处理非常基本的结构,例如本例中的 Hoge
,那么您可以只使用 shapeless 并跳过手动定义。