Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Improve your software quality with Property-Based Testing

Yoan
April 03, 2020

Improve your software quality with Property-Based Testing

Yoan

April 03, 2020
Tweet

More Decks by Yoan

Other Decks in Programming

Transcript

  1. @yot88
    PROPERTY-BASED TESTING
    (PBT)
    PBT

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. A dev story
    What is our code
    coverage ?

    View full-size slide

  5. @yot88
    Let’s add new tests

    View full-size slide

  6. @yot88
    A dev story
    WTF ?

    View full-size slide

  7. @yot88
    A dev story

    View full-size slide

  8. @yot88
    A dev story

    View full-size slide

  9. @yot88
    A dev story
    Let’s rethink the approach
    Do not use specific examples anymore

    View full-size slide

  10. @yot88
    A dev story
    We can’t test the add by using +

    View full-size slide

  11. @yot88
    PBT to the rescue

    View full-size slide

  12. @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

    View full-size slide

  13. Specification with properties
    Associativity property
    Commutativity property
    Identity property

    View full-size slide

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

    View full-size slide

  15. @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.

    View full-size slide

  16. What is Property based testing
    PBT

    View full-size slide

  17. @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

    View full-size slide

  18. @yot88
    What is Property based testing

    View full-size slide

  19. @yot88
    What can we do in java ?

    View full-size slide

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

    View full-size slide

  21. Junit-quickcheck

    View full-size slide

  22. Junit-quickcheck

    View full-size slide

  23. Junit-quickcheck

    View full-size slide

  24. Junit-quickcheck

    View full-size slide

  25. Junit-quickcheck

    View full-size slide

  26. Junit-quickcheck

    View full-size slide

  27. Junit-quickcheck

    View full-size slide

  28. Junit-quickcheck

    View full-size slide

  29. Junit-quickcheck

    View full-size slide

  30. @yot88
    And in real life ?

    View full-size slide

  31. 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

    View full-size slide

  32. 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

    View full-size slide

  33. Real life – implementation

    View full-size slide

  34. @yot88
    Vavr stuff ?

    View full-size slide

  35. @yot88
    And so ?

    View full-size slide

  36. @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

    View full-size slide

  37. @yot88
    What could we do together ?
    NEXT STEPS

    View full-size slide

  38. @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

    View full-size slide