Presented at Scaladores, August/2013
SCALACHECK
View Slide
SCALACHECKPedro Matiello[email protected]@pmatiello
SCALACHECK• Property-based testing• Scala
PROPERTIES
PROPERTIESdef sum(x:Int, y:Int) = x + y
PROPERTIESdef sum(x:Int, y:Int) = x + y# Property: ∀x,y : sum(x,y) = sum(y,x)
PROPERTIESdef sum(x:Int, y:Int) = x + y# Property: ∀x,y : sum(x,y) = sum(y,x)val commutativity = forAll {(x:Int, y:Int) => sum(x,y) == sum(y,x)}
PROPERTIESdef sum(x:Int, y:Int) = x + y# Property: ∀x,y : sum(x,y) = sum(y,x)val commutativity = forAll {(x:Int, y:Int) => sum(x,y) == sum(y,x)}org.scalacheck.Prop.forAll
PROPERTIESdef sum(x:Int, y:Int) = x + y# Property: ∀x,y : sum(x,y) = sum(y,x)val commutativity = forAll {(x:Int, y:Int) => sum(x,y) == sum(y,x)}commutativity.check
PROPERTIESdef sum(x:Int, y:Int) = x + y# Property: ∀x,y : sum(x,y) = sum(y,x)val commutativity = forAll {(x:Int, y:Int) => sum(x,y) == sum(y,x)}commutativity.check+ OK, passed 100 tests
CONDITIONAL PROPERTIES
CONDITIONAL PROPERTIESdef sum(x:Int, y:Int) = x + y# Property: ∀x,y>0 : sum(x,y) > x
CONDITIONAL PROPERTIESdef sum(x:Int, y:Int) = x + y# Property: ∀x,y>0 : sum(x,y) > xval greater = forAll {(x:Int, y:Int) => y > 0 ==> sum(x,y) > x}
CONDITIONAL PROPERTIESdef sum(x:Int, y:Int) = x + y# Property: ∀x,y>0 : sum(x,y) > xval greater = forAll {(x:Int, y:Int) => y > 0 ==> sum(x,y) > x}greater.check
CONDITIONAL PROPERTIESdef sum(x:Int, y:Int) = x + y# Property: ∀x,y>0 : sum(x,y) > xval greater = forAll {(x:Int, y:Int) => y > 0 ==> sum(x,y) > x}greater.check! Falsified after 2 passed tests.> ARG_0: 51047075> ARG_1: 2096436573
CONDITIONAL PROPERTIESscala> 51047075 + 2096436573res0: Int = -2147483648
CONDITIONAL PROPERTIESscala> 51047075 + 2096436573res0: Int = -2147483648scala> 51047075l + 2096436573lres1: Long = 2147483648
GENERATORS
GENERATORSdef sum(x:Int, y:Int) = x + y# ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0
GENERATORSdef sum(x:Int, y:Int) = x + y# ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0val evenInt = arbitrary[Int]suchThat (_ % 2 == 0)
GENERATORSdef sum(x:Int, y:Int) = x + y# ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0val evenInt = arbitrary[Int]suchThat (_ % 2 == 0)org.scalacheck.Arbitrary.arbitrary
GENERATORSdef sum(x:Int, y:Int) = x + y# ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0val evenInt = arbitrary[Int]suchThat (_ % 2 == 0)forAll(evenInt, evenInt) {(x:Int, y:Int) => sum(x,y) % 2 == 0}.check
GENERATORSdef sum(x:Int, y:Int) = x + y# ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0val evenInt = arbitrary[Int]suchThat (_ % 2 == 0)forAll(evenInt, evenInt) {(x:Int, y:Int) => sum(x,y) % 2 == 0}.check+ OK, passed 100 tests