$30 off During Our Annual Pro Sale. View Details »

Improve your software quality with Property-Based Testing

April 03, 2020

Improve your software quality with Property-Based Testing


April 03, 2020

More Decks by Yoan

Other Decks in Programming



  2. @yot88 A DEV STORY Scott Wlaschin https://fr.slideshare.net/ScottWlaschin/an-introduction-to-property-based-testing

  3. A dev story

  4. A dev story

  5. A dev story

  6. A dev story

  7. @yot88 Which tests would you have been written ?

  8. A dev story

  9. A dev story

  10. A dev story

  11. A dev story

  12. A dev story

  13. A dev story

  14. A dev story

  15. A dev story What is our code coverage ?

  16. None
  17. @yot88 Let’s add new tests

  18. @yot88 A dev story WTF ?

  19. @yot88 A dev story

  20. A dev story

  21. @yot88 A dev story

  22. @yot88 A dev story Let’s rethink the approach Do not

    use specific examples anymore
  23. @yot88 A dev story We can’t test the add by

    using +
  24. @yot88 PBT to the rescue

  25. @yot88 Testing with requirements / properties What about parameter order

    ? (compared to subtract) The parameter order does not matter when_I_add_two_numbers_the_result_should_not_depend_on_parameter_order “add 1” twice is the same as doing “add 2” (compared to multiply) What about adding 0 ? Adding 0 does nothing We are confident the implementation is correct if we test these properties It applies to all inputs
  26. Specification with properties Associativity property Commutativity property Identity property

  27. @yot88 Is there a simpler way to do it ?

  28. @yot88 What is Property based testing ? A property is

    the combination of an invariant with an input values generator. For each generated value, the invariant is treated as a predicate and checked whether it yields true or false for that value. As soon as there is one value which yields false, the property is said to be falsified, and checking is aborted. If a property cannot be invalidated after a specific amount of sample data, the property is assumed to be satisfied.
  29. What is Property based testing PBT

  30. @yot88 What is Property based testing ? Describe the input

    Describe the properties of the output Have the computer try lots of random examples Check if it fails
  31. @yot88 What is Property based testing

  32. @yot88 What can we do in java ?

  33. Junit-quickcheck https://pholser.github.io/junit-quickcheck/site/0.9.1/

  34. Junit-quickcheck

  35. Junit-quickcheck

  36. Junit-quickcheck

  37. Junit-quickcheck

  38. Junit-quickcheck

  39. Junit-quickcheck

  40. Junit-quickcheck

  41. Junit-quickcheck

  42. Junit-quickcheck

  43. @yot88 And in real life ?

  44. Real life

  45. Real life – identify properties The balance should be decremented

    of the withdrawal amount when I have enough money Or the overdraft is authorized for my account I must not be allowed to withdraw when The withdraw amount is over my max withdrawal amount My balance is insufficient, and overdraft is not authorized for my account
  46. Real life – custom generators To use them Or use

    the serviceloader by creating a file called: com.pholser.junit.quickcheck.generator.Generator in META-INF/services
  47. Real life – implementation

  48. @yot88 Vavr stuff ?

  49. PBT in vavr

  50. PBT in vavr

  51. @yot88 And so ?

  52. @yot88 PBT and example-based tests PBTs are more general 1

    property-based test can replace many example-based tests PBTs can reveal edge cases Nulls, negative numbers, weird strings (encoding for example), … PBTs ensures deep understanding of the business invariants Example-based tests are still helpful though Easier to understand & start with
  53. @yot88 What could we do together ? NEXT STEPS

  54. @yot88 Resources An introduction to property-based testing – Scott Wlaschin

    Property-Based Testing for everyone - Romeu Moura (Video) Property-based testing in Java with JUnit-Quickcheck - Kenny Baas-Schwegler https://baasie.com/2017/06/12/property-based-testing-in-java-with-junit-quickcheck-part-2- generators/ Property Testing with vavr junit-quickcheck documentation