Save 37% off PRO during our Black Friday Sale! »

Property Based Testing - BBL Lucca 2016

Property Based Testing - BBL Lucca 2016

Beb422437c1dfb5366f197919e41ac50?s=128

Arnaud LEMAIRE
PRO

December 05, 2016
Tweet

Transcript

  1. Property Based Testing @lilobase - arpinum.fr

  2. public class FizzBuzzTDD {
 public static String fizzBuzz(int i) {


    if(i%15 == 0) return "FizzBuzz";
 if(i%3 == 0) return "Fizz";
 if(i%5 == 0) return "Buzz";
 
 return String.valueOf(i);
 }
 } Merci à @XDetant & @malk_zameth
  3. public class FizzBuzzTDDTest {
 @Test
 public void it_returns_1_for_1() {
 assertThat(FizzBuzzTDD.fizzBuzz(1)).isEqualTo("1");


    }
 
 @Test
 public void it_returns_2_for_2() {
 assertThat(FizzBuzzTDD.fizzBuzz(2)).isEqualTo("2");
 }
 
 @Test
 public void it_returns_fizz_when_times_3() {
 assertThat(FizzBuzzTDD.fizzBuzz(3)).isEqualTo("Fizz");
 }
 
 @Test
 public void it_returns_buzz_when_times_5() {
 assertThat(FizzBuzzTDD.fizzBuzz(5)).isEqualTo("Buzz");
 }
 
 @Test
 public void it_returns_fizzbuzz_when_times_15() {
 assertThat(FizzBuzzTDD.fizzBuzz(15)).isEqualTo("FizzBuzz");
 }
 }
  4. @RunWith(DataProviderRunner.class)
 public class FizzBuzzParametrizedTest {
 
 @DataProvider
 public static Object[][]

    times3() {
 return new Object[][]{{3},{6}};
 }
 
 @Test
 @UseDataProvider("times3")
 public void it_returns_fizz_when_times_3(int n) {
 assertThat(FizzBuzzTDD.fizzBuzz(n)).isEqualTo("Fizz");
 
 }
 
 @DataProvider
 public static Object[][] times5() {
 return new Object[][]{{5},{10}};
 }
 
 @Test
 @UseDataProvider("times5")
 public void it_returns_buzz_when_times_5(int n) {
 assertThat(FizzBuzzTDD.fizzBuzz(n)).isEqualTo("Buzz");
 
 }
 
 @DataProvider
 public static Object[][] times15() {
 return new Object[][]{{15},{30}};
 }
 
 @Test
 @UseDataProvider("times15")
 public void it_returns_fizzbuzz_when_times_15(int n) {
 assertThat(FizzBuzzTDD.fizzBuzz(n)).isEqualTo("FizzBuzz");
 
 }
 }
  5. @RunWith(JUnitQuickcheck.class)
 public class FizzBuzzPropertiesTest {
 @Property
 public void multiple_of_three_contains_fizz(int n)

    {
 assumeThat(n%3, equalTo(0));
 assertThat(FizzBuzzTDD.fizzBuzz(n)).contains("Fizz");
 }
 @Property
 public void multiple_of_five_contains_buzz(int n) {
 assumeThat(n%5, equalTo(0));
 assertThat(FizzBuzzTDD.fizzBuzz(n)).contains("Buzz");
 }
 }
 
 public class FizzBuzzTDDTest {
 @org.junit.Test
 public void it_returns_1_for_1() {
 assertThat(FizzBuzzTDD.fizzBuzz(1)).isEqualTo("1");
 }
 
 @Test
 public void it_returns_2_for_2() {
 assertThat(FizzBuzzTDD.fizzBuzz(2)).isEqualTo("2");
 }
 }
  6. Tester Comparer le comportement attendu avec le comportement observé

  7. Pourquoi le TDD ça suffit pas ? Le TDD consiste

    à avoir des tests ultra localisés par rapport au domaine de votre application
  8. Propriété ? Ce qui est toujours vrai dans certaines circonstances

  9. Add Commutatif -> l’ordre des entrées ne compte pas Associatif

    -> ajouter 1 deux fois revient à ajouter 2 une fois Avec une identité -> ajouter zéro ne change pas la valeur de l’entrée
  10. Add Commutatif -> 
 add x y == add y

    x Associatif -> 
 add(1, add(x, 1)) == add(x, 2) Avec une identité ->
 add(x, 0) == x
  11. Invariants du domaine Les dates autorisées sont toujours celles de

    l’année en cours Le total des opérations ne peux jamais dépasser un certain plafond Dès que vous avez des termes comme « toujours, jamais » : vous êtes face à un invariant
  12. Invariant vs Validations La validation se fait depuis l’extérieur de

    l’entité L’invariance est construite dans l’entité (souvent à l’aide d’une factory)
  13. Invariants & Propriétés Le property based testing permet de valider

    que ceux-ci ne sont pas violés par votre implémentation
  14. Historique & Définition La définition a longtemps été « ce

    que sait faire quickcheck » Avoir sa propre équipe de QA automatisée Un système de PBT va chercher à faire planter votre système en cherchant les « edge cases »
  15. Ça change quoi par rapport à du Fuzzing ? L’intention

    est différente : Le fuzzing consiste à envoyer des données pseudo-aléatoires : il test la « technique » Le PBT cherche à construire une spécification du SUT : il test le « métier » Le PBT va pouvoir trouver des erreurs qui ne seraient pas apparues avec un outil de fuzzing
  16. Fonctionnement Generator Shrinker Property Checker API

  17. Test Oracle Le PBT permet d’effectuer du test « Oracle

    » Il s’agit de vérifier un algorithme complexe à l’aide d’un équivalent
  18. Ça sert à quoi alors ? Permet de réellement tester

    vos invariants Vous oblige à mieux comprendre votre domaine Permet de DRY les tests
  19. Model Based Testing

  20. Tester une série d’états ? Comment réussir à tester les

    chemins possibles ?
  21. Tester Comparer le comportement attendu avec le comportement observé

  22. La pyramide des tests http:/ /martinfowler.com/ TDD -> PBT BDD

    -> MBT
  23. Merci @lilobase - arpinum.fr