Использование ScalaCheck для генерации данных базы данных

Есть ли способ сгенерировать поддельные данные базы данных с помощью ScalaCheck? Например, если я загружаю определения схемы моей базы данных в ScalaCheck, есть ли способ, которым он может сгенерировать то, что мне нужно для тестирования каждой имеющейся у меня модели? Есть ли способ поддерживать ссылочную целостность?


person Ben Nelson    schedule 17.04.2017    source источник
comment
Насколько я знаю, вам нужно создать генераторы самостоятельно. Вероятно, вы можете создать общую функцию, используя отражение/макросы.   -  person pedrorijo91    schedule 17.04.2017


Ответы (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 и пропустите ручные определения.

person Charles    schedule 22.04.2017