Slide 1

Slide 1 text

SCALACHECK

Slide 2

Slide 2 text

SCALACHECK Pedro Matiello [email protected] @pmatiello

Slide 3

Slide 3 text

SCALACHECK • Property-based testing • Scala

Slide 4

Slide 4 text

PROPERTIES

Slide 5

Slide 5 text

PROPERTIES def sum(x:Int, y:Int) = x + y

Slide 6

Slide 6 text

PROPERTIES def sum(x:Int, y:Int) = x + y # Property: ∀x,y : sum(x,y) = sum(y,x)

Slide 7

Slide 7 text

PROPERTIES def 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) }

Slide 8

Slide 8 text

PROPERTIES def 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) }

Slide 9

Slide 9 text

PROPERTIES def 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

Slide 10

Slide 10 text

PROPERTIES def 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

Slide 11

Slide 11 text

PROPERTIES def 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

Slide 12

Slide 12 text

CONDITIONAL PROPERTIES

Slide 13

Slide 13 text

CONDITIONAL PROPERTIES def sum(x:Int, y:Int) = x + y # Property: ∀x,y>0 : sum(x,y) > x

Slide 14

Slide 14 text

CONDITIONAL PROPERTIES def sum(x:Int, y:Int) = x + y # Property: ∀x,y>0 : sum(x,y) > x val greater = forAll { (x:Int, y:Int) => y > 0 ==> sum(x,y) > x }

Slide 15

Slide 15 text

CONDITIONAL PROPERTIES def sum(x:Int, y:Int) = x + y # Property: ∀x,y>0 : sum(x,y) > x val greater = forAll { (x:Int, y:Int) => y > 0 ==> sum(x,y) > x }

Slide 16

Slide 16 text

CONDITIONAL PROPERTIES def sum(x:Int, y:Int) = x + y # Property: ∀x,y>0 : sum(x,y) > x val greater = forAll { (x:Int, y:Int) => y > 0 ==> sum(x,y) > x } greater.check

Slide 17

Slide 17 text

CONDITIONAL PROPERTIES def sum(x:Int, y:Int) = x + y # Property: ∀x,y>0 : sum(x,y) > x val 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

Slide 18

Slide 18 text

CONDITIONAL PROPERTIES scala> 51047075 + 2096436573 res0: Int = -2147483648

Slide 19

Slide 19 text

CONDITIONAL PROPERTIES scala> 51047075 + 2096436573 res0: Int = -2147483648 scala> 51047075l + 2096436573l res1: Long = 2147483648

Slide 20

Slide 20 text

GENERATORS

Slide 21

Slide 21 text

GENERATORS def sum(x:Int, y:Int) = x + y # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0

Slide 22

Slide 22 text

GENERATORS def sum(x:Int, y:Int) = x + y # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0 val evenInt = arbitrary[Int] suchThat (_ % 2 == 0)

Slide 23

Slide 23 text

GENERATORS def sum(x:Int, y:Int) = x + y # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0 val evenInt = arbitrary[Int] suchThat (_ % 2 == 0) org.scalacheck.Arbitrary.arbitrary

Slide 24

Slide 24 text

GENERATORS def sum(x:Int, y:Int) = x + y # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0 val evenInt = arbitrary[Int] suchThat (_ % 2 == 0) forAll(evenInt, evenInt) { (x:Int, y:Int) => sum(x,y) % 2 == 0 }.check

Slide 25

Slide 25 text

GENERATORS def sum(x:Int, y:Int) = x + y # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0 val evenInt = arbitrary[Int] suchThat (_ % 2 == 0) forAll(evenInt, evenInt) { (x:Int, y:Int) => sum(x,y) % 2 == 0 }.check

Slide 26

Slide 26 text

GENERATORS def sum(x:Int, y:Int) = x + y # ∀x,y, x%2=0,y%2=0 : sum(x,y)%2 = 0 val evenInt = arbitrary[Int] suchThat (_ % 2 == 0) forAll(evenInt, evenInt) { (x:Int, y:Int) => sum(x,y) % 2 == 0 }.check + OK, passed 100 tests

Slide 27

Slide 27 text

SCALACHECK Pedro Matiello [email protected] @pmatiello