Derivation of ZIO Test Generators
Introduction
ZIO Test supports property-based testing via the Gen
type. Gen[R, A]
is a random generator of values of type A
. Such a generator can be used to produce test cases for a property, which can then be checked for validity. The zio-schema-zio-test
module provides a way to derive a Gen[R, A]
from a Schema[A]
. In this section, we will see how this functionality works.
Installation
In order to derive a generator from a ZIO Schema, we need to add the following dependency to our build.sbt
file:
libraryDependencies += "dev.zio" %% "zio-schema-zio-test" % 1.5.0
DriveGen
The DriveGen
inside zio.schema
package provides the gen
operator which takes a Schmea[A]
implicitly and returns a Gen[Sized, A]
:
object DeriveGen {
def gen[A](implicit schema: Schema[A]): Gen[Sized, A] = ???
}
Example
In the following example, we will derive a generator for the Person
class using the DeriveGen.gen
operator:
import zio.schema.{DeriveGen, DeriveSchema, Schema}
import zio.test.{Gen, Sized}
case class Person(name: String, age: Int)
object Person {
implicit val schema: Schema[Person] = DeriveSchema.gen
val gen: Gen[Sized, Person] = DeriveGen.gen
}
import zio.test._
object ExampleSpec extends ZIOSpecDefault {
def spec =
test("example test") {
check(Person.gen) { p =>
assertTrue(???)
}
}
}