Есть ли способ сгенерировать поддельные данные базы данных с помощью ScalaCheck? Например, если я загружаю определения схемы моей базы данных в ScalaCheck, есть ли способ, которым он может сгенерировать то, что мне нужно для тестирования каждой имеющейся у меня модели? Есть ли способ поддерживать ссылочную целостность?
Использование ScalaCheck для генерации данных базы данных
Ответы (1)
Вам нужно будет вручную создать генераторы для моделей. Вы можете создать произвольный экземпляр для любого объекта и класса из генератора. Например:
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 и пропустите ручные определения.