Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests...
Transcript of Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests...
![Page 1: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/1.jpg)
@jessitron
Property Based Testing for Better Code
![Page 2: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/2.jpg)
lots of tests
maintenance burden
didn't test seams
![Page 3: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/3.jpg)
Scala
ScalaCheck
Property Based Testing
![Page 4: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/4.jpg)
Scala
ScalaCheck
Property Based Testing
![Page 5: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/5.jpg)
![Page 6: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/6.jpg)
![Page 7: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/7.jpg)
![Page 8: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/8.jpg)
Define Success
![Page 9: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/9.jpg)
Design
Documentation
Quality
Enable Change
![Page 10: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/10.jpg)
Generators Properties
![Page 11: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/11.jpg)
Generators
![Page 12: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/12.jpg)
GeneratorsDocument: what is valid input data?
Design: build up from components
Quality: automatic corner cases
Enable: tests of larger components
![Page 13: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/13.jpg)
Enable: tests of larger components
![Page 14: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/14.jpg)
![Page 15: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/15.jpg)
![Page 16: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/16.jpg)
![Page 17: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/17.jpg)
![Page 18: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/18.jpg)
![Page 19: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/19.jpg)
![Page 20: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/20.jpg)
![Page 21: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/21.jpg)
Game
Rules # turns
Player PlayerStrategy Strategy
![Page 22: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/22.jpg)
Rules
![Page 23: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/23.jpg)
case class Rules(temptationToDefect: Points, rewardForMutualCooperation: Points, punishmentForMutualDefection: Points, suckersPenalty: Points)
![Page 24: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/24.jpg)
property("The game is fair") = forAll {(rules: Rules, moves: MoveSet) => val oneWay = Rules.score(rules, moves) val theOtherWay = Rules.score(rules, moves.swap) !
oneWay.swap == theOtherWay }
object RuleTest extends Properties("Prisoners Dilemma") {
}
![Page 25: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/25.jpg)
property("Defection is always better for me") = forAll {(rules: Rules, theirMove: Move) => val ifIDefect = Rules.score(rules, (Defect, theirMove))._1 val ifICooperate = Rules.score(rules, (Cooperate, theirMove))._1 !
ifIDefect > ifICooperate }
object RuleTest extends Properties("Prisoners Dilemma") {
}
![Page 26: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/26.jpg)
A => B
![Page 27: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/27.jpg)
Properties
![Page 28: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/28.jpg)
Properties
Document: what is important?
Quality: they are always true
![Page 29: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/29.jpg)
property("The sucker always cooperates") = forAll(strategyGen, Gen.posNum[Int]) { (opponent: Strategy, turns: Int) => val allMoves:Stream[MoveSet] = Strategy.moves(Strategy.sucker, opponent).take(turns) val myMoves = allMoves.map (_._1) !
myMoves.forall(_ == Cooperate) }
![Page 30: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/30.jpg)
Complete properties
Incomplete properties
Relational properties
![Page 31: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/31.jpg)
forAll { (list: List[Int] => list.reverse.reverse = list }
![Page 32: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/32.jpg)
forAll { (input: Input) => oldWay(input) =? newWay(input) }
![Page 33: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/33.jpg)
forAll { (output: Output) => val input = from(output) subject(input) ?= output }
![Page 34: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/34.jpg)
property("All games end within the time limit") = forAll { (rules: Rules, players: Seq[Player], limit: Duration) => classify(players.size < 10, "small", "large") { val timer = new Timer() val output = Game.eachOnEach(rules)(sys, players, limit) val timeTaken = timer.check val timeOver = timeTaken - limit !
classify (timeOver < (fudge/2), "comfortable", "barely") { (timeTaken <= (limit + fudge)) :| s"$timeTaken was longer than $limit" }}}
![Page 35: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/35.jpg)
![Page 36: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/36.jpg)
Properties
Document: what is important?
Design: what do we need to know?
Quality: they are always true
Enable: changes to less important bits
![Page 37: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/37.jpg)
What does it make free?
What does it make explicit?
What does it make impossible?
![Page 38: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/38.jpg)
Scala
ScalaCheck
Property Based Testing
![Page 39: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/39.jpg)
http://www.artima.com/shop/scalacheck
![Page 40: Property Based Testing for Better Code · Property Based Testing for Better Code. lots of tests maintenance burden didn't test seams. Scala ScalaCheck Property Based Testing. Scala](https://reader034.fdocuments.in/reader034/viewer/2022042303/5ece2c88ee11c142a623db20/html5/thumbnails/40.jpg)
@jessitron
https://github.com/jessitron/scalacheck-prisoners-dilemma